在从容器视图控制器添加/删除时,如何为子视图控制器设置动画?
我有以下2个函数添加和删除从容器视图控制器触发的子视图控制器:
@discardableResult func addChildViewController(withChildViewController childViewController: UIViewController) -> UIViewController { // Add Child View Controller addChildViewController(childViewController) childViewController.beginAppearanceTransition(true, animated: true) // Add Child View as Subview view.addSubview(childViewController.view) // Configure Child View childViewController.view.frame = view.bounds childViewController.view.autoresizingMask = [.flexibleWidth, .flexibleHeight] // Notify Child View Controller childViewController.didMove(toParentViewController: self) return childViewController } @discardableResult func removeChildViewController(withChildViewController childViewController: UIViewController) -> UIViewController { // Notify Child View Controller childViewController.willMove(toParentViewController: nil) childViewController.beginAppearanceTransition(false, animated: true) // Remove Child View From Superview childViewController.view.removeFromSuperview() // Notify Child View Controller childViewController.removeFromParentViewController() return childViewController }
上面的函数是UIViewController的扩展,所以我所做的只是父视图控制器上的self.addChildViewController()和self.removeChildViewController()。
如何在出路时移除视图的动画以及在路上添加的视图?
不同子视图控制器之间的动画: –
func cycleFromViewController(oldViewController: UIViewController, toViewController newViewController: UIViewController) { oldViewController.willMove(toParentViewController: nil) newViewController.view.translatesAutoresizingMaskIntoConstraints = false self.addChildViewController(newViewController) self.addSubview(subView: newViewController.view, toView:self.containerView!) newViewController.view.alpha = 0 newViewController.view.layoutIfNeeded() UIView.animate(withDuration: 0.5, delay: 0.1, options: .transitionFlipFromLeft, animations: { newViewController.view.alpha = 1 oldViewController.view.alpha = 0 }) { (finished) in oldViewController.view.removeFromSuperview() oldViewController.removeFromParentViewController() newViewController.didMove(toParentViewController: self) } }
在上面,
- oldViewController: – 当前显示的子viewController
- newViewController: – 将要添加的新子视图控制器
- containerView: – 显示所有子控制器的视图。
要为子视图设置动画,可以根据要求将transitionFlipFromLeft替换为可用的UIViewAnimationOptions ,从而使用不同类型的动画样式。
Sagar的答案不完整addSubview
方法在那里缺失
这是完整的答案
func cycleFromViewController(oldViewController: UIViewController, toViewController newViewController: UIViewController) { oldViewController.willMove(toParentViewController: nil) newViewController.view.translatesAutoresizingMaskIntoConstraints = false self.addChildViewController(newViewController) self.addSubview(subView: newViewController.view, toView:self.containerView!) newViewController.view.alpha = 0 newViewController.view.layoutIfNeeded() UIView.animate(withDuration: 0.5, delay: 0.1, options: .transitionFlipFromLeft, animations: { newViewController.view.alpha = 1 oldViewController.view.alpha = 0 }) { (finished) in oldViewController.view.removeFromSuperview() oldViewController.removeFromParentViewController() newViewController.didMove(toParentViewController: self) } } //-------------------------------------------------------------------------------- private func addSubview(subView:UIView, toView parentView:UIView) { self.view.layoutIfNeeded() parentView.addSubview(subView) subView.leadingAnchor.constraint(equalTo: parentView.leadingAnchor).isActive = true subView.topAnchor.constraint(equalTo: parentView.topAnchor).isActive = true subView.bottomAnchor.constraint(equalTo: parentView.bottomAnchor).isActive = true subView.trailingAnchor.constraint(equalTo: parentView.trailingAnchor).isActive = true }
希望它对某人有帮助
- 以正确的方式上传/下载多张图片?
- 核心数据可转换属性(NSArray)为空
- 处理iPhone 6/6 +启动图像
- E2E:使用Wix Detox从UIImagePickerController中选择一个图像
- 如何从iOS ADAL身份validationLogOut?
- iOS表情符号是一项严肃的业务-第2部分:模仿iOS 8.3的表情符号键盘
- 自定义MKAnnotation标注泡泡
- predicateWithBlock作为ABPeoplePicker.predicateForEnablingPerson的谓词导致exception
- 发送CLLocationCoordinate2D到不兼容types的参数在Xcode 4.5中我的代码