Как отобразить представление контейнера с анимацией в 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:.

Как я могу написать код анимации?


person Blaszard    schedule 02.10.2014    source источник


Ответы (2)


Вы можете использовать переход просмотра следующим образом:

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

Это анимирует изменение содержимого представления контейнера (чтобы отразить добавляемое подпредставление) вместо того, чтобы пытаться анимировать сам переход контроллера представления. Вам не нужно будет использовать transitionFromViewController таким образом.

person Greg    schedule 02.10.2014
comment
Спасибо! И self.vc.view, а не vc.view, потому что он внутри замыкания (не могу его редактировать, потому что self содержит только 4 символа). - person Blaszard; 03.10.2014
comment
@Gardecolo спасибо, исправил. Сейчас я редко использую Swift из-за этих несоответствий. - person Greg; 03.10.2014
comment
Без проблем. Кстати, я должен написать метод непосредственно перед addViewController или после didMoveToParentViewController? Похоже, оба работали правильно, поэтому хотел узнать, как лучше. - person Blaszard; 03.10.2014
comment
@Gardecolo stackoverflow.com/a/10146060/834998 вам, вероятно, также следует добавить вызов willMoveToParentViewController:. - person Greg; 03.10.2014
comment
Спасибо. Я посмотрю видео позже. Что касается willMoveToParentController, то он автоматически вызывается при вызове addChildViewController. developer.apple.com/library/ios/Documentation/UIKit/Reference/: - person Blaszard; 03.10.2014
comment
@Gardecolo выглядит как новое дополнение, я помню, что мне приходилось вызывать его вручную, когда я делал это в прошлом году. - person Greg; 03.10.2014

быстрая 4 версия ответа @Greg

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