【问题标题】:How do I animate child view controllers when adding to/removing from a container view controller?在容器视图控制器中添加/删除时,如何为子视图控制器设置动画?
【发布时间】:2017-06-26 04:24:07
【问题描述】:

我有以下 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()。

如何为退出时移除的视图和进入时添加的视图设置动画?

【问题讨论】:

  • 您有多个子控制器并尝试在它们之间切换还是只有一个?
  • 我有多个子视图控制器,但在任何给定时间,我都会添加一个并删除最后一个。
  • 添加子视图控制器时你想要哪个动画?
  • 任何作品作为例子。让我们使用淡入淡出——所以被移除的子 VC 会淡出,而添加的子 VC 会淡入。

标签: ios swift animation uiviewcontroller uiviewanimation


【解决方案1】:

不同子视图控制器之间的动画:-

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 来使用不同类型的动画样式。

【讨论】:

  • 这让我有些接近了。我不得不做 view.addSubview(newViewController.view): self.addSubview(subView: newViewController.view, toView:self.containerView!) 没用。不过有了它,我的视图第一次消失时,它就消失了,但在那之后,我的视图就再也没有显示出来了。
【解决方案2】:

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
    }

希望对大家有帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多