我正在尝试开发Apple View文档中显示的Container View Controller。
现在我在viewDidAppear
中有简单的初始化代码:
presentedVC = self.storyboard!.instantiateViewControllerWithIdentifier(Storyboard.yesNoControllerID)
self.addChildViewController(presentedVC)
presentedID = Storyboard.yesNoControllerID
presentedVC.view.frame = containerView.bounds
self.containerView.addSubview(presentedVC.view)
presentedVC.didMoveToParentViewController(self)
我已经实现了交换方法,就像在Apple doc中一样:
private func exchangeVC(withVC viewController: UIViewController){
presentedVC.willMoveToParentViewController(nil)
self.addChildViewController(viewController)
viewController.view.frame = newViewStartFrame
let endFrame = oldViewEndFrame
self.containerView.addSubview(viewController.view)
self.transitionFromViewController(presentedVC, toViewController: viewController, duration: 0.25, options: UIViewAnimationOptions.CurveLinear, animations: {
viewController.view.frame = self.presentedVC.view.frame
self.presentedVC.view.frame = endFrame
}) { (finished) in
self.presentedVC.view.removeFromSuperview()
self.presentedVC.removeFromParentViewController()
viewController.didMoveToParentViewController(self)
self.presentedVC = viewController
}
}
然后,我有一个简单的按钮:
let controller = self.storyboard!.instantiateViewControllerWithIdentifier(presentedID)
exchangeVC(withVC: controller)
使用此代码,我的控制器在按下按钮时在屏幕上显示动画。但是在动画结束时我得到了:
你能告诉我我做错了什么吗?如何摆脱这个错误/警告?对开始/结束外观转换的不平衡调用 UIViewController:0x7aecf730。
答案 0 :(得分:2)
这是一个容易犯的错误,但Apple的transition(from:to:duration:options:animations:completion:)
文档指出:
此方法将第二个视图控制器的视图添加到视图中 层次结构,然后执行动画中定义的动画 块。动画完成后,它会删除第一个视图 视图层次结构中的控制器视图。
您收到了Unbalanced calls to begin/end appearance transitions
警告,因为您使用以下内容添加了子视图:
self.containerView.addSubview(viewController.view)
...然后在调用transition(from:to:duration:options:animations:completion:)
删除对addSubview
的调用可以解决问题。
答案 1 :(得分:1)
我有类似的问题。通常,当您尝试呈现相同的视图控制器而不首先解除它时会出现该警告,但转换方法应该为您处理所有这些。我最后使用
来修复它UIView.animate(withDuration:animations:completion:)
而不是
UIViewController.transition(from:to:duration:options:animations:completion:)
如上所述。当然,我也必须手动添加和删除子视图。我不确定为什么这个改变有效,但我最好的猜测是发出警告的UIViewController
转换方法有问题。幸运的是,修复非常简单。
答案 2 :(得分:0)
在按钮点击处理程序中,我在iPhone上看到此不平衡通话错误。追溯到解雇(动画:否),然后是礼物(..动画:否)
解决方案是在完成处理程序中处理此dismiss调用。