我一直在编写一个迷你框架,用于动画iOS中的自定义segues。它在iOS 7中运行良好,但是一旦我开始在iOS 8中进行测试,一切都会失败。
我这样做的原因是我想要为视图的内容设置动画,而不是框架。到目前为止,我认为我看到的所有segue动画都为框架设置了动画,如翻转,卷曲等等。相反,我想在视图中设置约束的动画。也就是说,按钮向上,向下,向左等等。
我是通过创建一个自定义segue类HySegue
来实现的,该类轮询视图控制器以呈现和解除动画,如果它们符合给定的协议。到目前为止一切都很好。
我现在需要运行动画,但问题出在哪里。这就是我正在做的事情:
UIView * sourceView = sourceViewController.view;
UIView * destinationView = viewControllerToPresent.view;
// Force the source view to layout
[sourceView addSubview:destinationView];
[sourceView layoutIfNeeded];
所以我的想法是将目标视图添加为源视图的子视图,运行动画,还原以前的更改,最后显示目标视图控制器。这是:
UIViewController * parentViewController = viewControllerToDismiss.parentViewController;
UIView * destinationView = destinationViewController.view;
// Break the view hierarchy that was setup earlier
[destinationView removeFromSuperview];
// When presenting in a UINavigationController stack, push the destination view controller
if ([parentViewController isKindOfClass:[UINavigationController class]]) {
[(UINavigationController *)parentViewController pushViewController:destinationViewController
animated:NO];
}
// Otherwise use the standard method
else {
// Present the destination view controller
[viewControllerToDismiss presentViewController:destinationViewController
animated:NO
completion:nil];
[viewControllerToDismiss willMoveToParentViewController:nil];
[viewControllerToDismiss.view removeFromSuperview];
[viewControllerToDismiss removeFromParentViewController];
[viewControllerToDismiss didMoveToParentViewController:nil];
}
同样,这在iOS 7中运行良好,但在iOS 8中我得到:
Unbalanced calls to begin/end appearance transitions for <HyRegistrationNavigationController: 0x7bf540c0>
所以看来我正在尝试在前一个完成显示之前显示一个视图控制器。我怎么解决这个问题?理想情况下,会有第三个视图和视图控制器,它将作为转换的容器,但我可以没有它。