如何在iOS中使用动画显示容器视图?

问题描述:

我想要当用户敲击在原始视图控制器的按钮以显示自己的自定义视图,所以我试图限定其引起以下功能当用户点击该按钮:如何在iOS中使用动画显示容器视图?

func show() { 
    vc = UIViewController() 
    var button = UIButton(frame: CGRect(x: 0, y: 0, width: 200, height: 200)) 
    button.backgroundColor = UIColor.redColor() 
    button.addTarget(self, action: "hide", forControlEvents: UIControlEvents.TouchDown) 
    vc.view.addSubview(button) 

    self.addChildViewController(vc) 
    self.view.addSubview(vc.view) 
    vc.didMoveToParentViewController(self) 
} 

当用户点击按钮,然而,容器视图突然显示在屏幕上,但我想让它更平滑地显示。所以下次我试着用动画来改写它,但我已经打在了墙上,因为我不知道我应该以动画来显示它写:

transitionFromViewController(self, toViewController: vc, duration: 0.5, options: UIViewAnimationOptions.TransitionCrossDissolve, animations: {() -> Void in 
     self.addChildViewController(self.vc) 
     self.view.addSubview(self.vc.view) 
     }, completion: { 
     Bool -> Void in 
     self.vc.didMoveToParentViewController(self) 
}) 

这将返回一个错误:'NSInvalidArgumentException', reason: 'Children view controllers <mmmmlvalsllsl.ViewController: 0x7fc980f71f70> and <UIViewController: 0x7fc980f6dd00> must have a common parent view controller when calling -[UIViewController transitionFromViewController:toViewController:duration:options:animations:completion:]'

我想我应该用这个方法,但是我不知道在animations:块和completion:块中写什么代码。

我该如何编写动画代码?

您可以使用view transitioning像这样:

UIView.transitionWithView(self.view, duration: 0.5, options: .TransitionFlipFromLeft, animations: { _ in 
    self.view.addSubview(self.vc.view) 
}, completion: nil) 

这将动画在容器视图的内容的变化(以反映正在添加的子视图),而不是试图以动画视图控制器过渡本身。所有这些你都不需要使用transitionFromViewController

+1

+1的过渡期,而不是一个视图控制器。 – 2014-10-02 23:43:34

+0

谢谢! 'self.vc.view',而不是'vc.view',因为它在一个闭包内(不能编辑它,因为'self'只包含4个字符)。 – Blaszard 2014-10-02 23:49:12

+0

@Gardecolo谢谢,修正了这个问题。由于这些不一致,我现在不使用Swift。 – Greg 2014-10-02 23:50:38

SWIFT 4版@格雷格的答案

UIView.transition(with: self.view, duration: 0.5, options: .transitionFlipFromLeft, animations: { 
       self.view.addSubview(self.vc.view) 
      }, completion: nil)