gpt4 book ai didi

ios - UINavigationController 与 subview Controller 的奇怪行为

转载 作者:行者123 更新时间:2023-11-30 11:20:06 25 4
gpt4 key购买 nike

我需要导航 Controller 堆栈中所有 Controller 的可拖动 View 。为了管理这个 View 和手势识别器,我使用名为 ChildViewController 的自定义 VC。在 navController 的 viewDidLoad 方法中,我添加了子 Controller 。在 ChildViewController 中,我创建 View 并在 didMoveToParent 方法中设置约束。在手势识别器中使用约束常量来计算平移时的 View 位置。及其作品。但是每次当我在 navController 的堆栈中推送或弹出 Controller 时,navController 都会调用 ChildViewController 的 didMoveToParent 方法并设置约束。之后,手势识别器开始无法正常工作。我通过实现 isConstrainted 变量并在 didMoveToParent 中添加 if 语句来解决这个问题。现在,约束设置一次就可以很好地工作。但是为什么当我在viewDidLoad中添加一次子vc时,navController在推送或弹出时会调用子vc的didMoveToParent? GIF /image/MEeu6.gif gitHub 上的项目 https://github.com/ayatsev/ChildNavController

class CustomNavController: UINavigationController {

override func viewDidLoad() {
super.viewDidLoad()
let childController = ChildViewController()
addChild(childController)
view.addSubview(childController.view)
childController.didMove(toParent: self)
}

}


class ChildViewController: UIViewController {

var xConstraint: NSLayoutConstraint!
var yConstraint: NSLayoutConstraint!
var isConstrainted = false


lazy var childView: UIView = {
let cv = UIView()
cv.translatesAutoresizingMaskIntoConstraints = false
let panRecognizer = UIPanGestureRecognizer(target: self, action: #selector(handlePan))
cv.addGestureRecognizer(panRecognizer)
cv.backgroundColor = .green
return cv
}()

override func viewDidLoad() {
super.viewDidLoad()
view = childView
}

override func didMove(toParent parent: UIViewController?) {
print("--- CHILD: Did Move To Parent")
guard let parent = parent else {return}
if !isConstrainted {
childView.widthAnchor.constraint(equalToConstant: 50).isActive = true
childView.heightAnchor.constraint(equalToConstant: 50).isActive = true
xConstraint = childView.leadingAnchor.constraint(equalTo: parent.view.leadingAnchor, constant: 40)
xConstraint.isActive = true
yConstraint = childView.topAnchor.constraint(equalTo: parent.view.topAnchor, constant: parent.view.frame.height * 2 / 3)
yConstraint.isActive = true
isConstrainted = true
}
}

@objc func handlePan(recognizer: UIPanGestureRecognizer) {
guard let parent = parent else {return}
let translation = recognizer.translation(in: parent.view)

switch recognizer.state {
case .changed:
xConstraint.constant += translation.x
yConstraint.constant += translation.y
recognizer.setTranslation(CGPoint.zero, in: parent.view)
default:
break
}
}


}

最佳答案

But why navController call didMoveToParent of child vc when pushing or popping

没有必要问“为什么”。这就是系统的工作原理。有时 didMove(toParent:) 到达时没有相应的 willMove(toParent:)。有时,即使此 View Controller 以前是此父级的子级并且仍然是此父级的子级,didMove(toParent:) 也会到达。我知道这看起来很疯狂。但你不需要去推理为什么,你需要以一种连贯的方式响应你收到的消息的方式进行编码。

关于ios - UINavigationController 与 subview Controller 的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51350085/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com