ios - 在容器 View Controller 中添加/删除时如何为 subview Controller 设置动画?

标签 ios swift animation uiviewcontroller uiviewanimation

我有以下 2 个函数可以添加和删除从容器 View Controller 触发的 subview Controller :

@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 的扩展,所以我所做的只是父 View Controller 上的 self.addChildViewController() 和 self.removeChildViewController()。

如何为 View 在离开时被删除和 View 在进入时添加动画?

最佳答案

不同 subview Controller 之间的动画:-

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:- 当前显示的 subview Controller
  • newViewController:- 将要添加的新 subview Controller
  • containerView:- 显示所有子 Controller 的 View 。

要为 subview 设置动画,您可以根据需要将 transitionFlipFromLeft 替换为可用的 UIViewAnimationOptions 来使用不同类型的动画样式。

关于ios - 在容器 View Controller 中添加/删除时如何为 subview Controller 设置动画?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44753084/

相关文章:

ios - ScrollView -> View (Label + Label + TableView) 和自动布局

ios - 应用程序启动后出现错误 "dyld_sim` dyld_fatal_error"

iOS 7 UIToolBar 覆盖状态栏

swift - dateFromString() 返回不正确的日期

Swift URLSession 防止重定向

ios - UIImageView 停止动画

更新 Firefox 后 CSS3 动画波动

ios - SKAction.colorizeWithColor 使 SKLabelNode 消失

swift - xcode 7 swiftui webview https输出语句

ios - 如何在 ios 的方形应用程序中创建相同的动画?