我已经为UINavigationController实现了一个自定义转换,它在演示时会缩放呈现视图,并且在关闭时会缩小视图控制器被撤回。
我还实施了百分比驱动的互动。
我有一个奇怪的错误,只发生在iOS 7.0。*(我的应用程序的目标是7.0及以上)。仅在某些屏幕上(但可重复),如果我通过调用cancelInteractiveTransition
对象上的UIPercentDrivenInteractiveTransition
来取消百分比驱动转换,而不是取消转换,则会显示顶视图控制器视图,并在UIView动画中设置属性我的UIViewControllerContextTransitioning
对象用于解雇动画的块。
因此,例如,如果我设置解雇动画以将解雇视图控制器缩小到50%,我会看到顶视图控制器缩放到50%,后面有黑色屏幕,而不是应该是全尺寸,因为它应该是我已取消过渡。
一切都适用于iOS 7.1及更高版本,以及iOS 7.0中的一些scree。
之前有没有人见过这样的事情或者知道问题可能是什么?
以下是一些代码:
UINavigationControllerDelegate协议方法的实现:
- (id<UIViewControllerAnimatedTransitioning>)navigationController:(UINavigationController *)navigationController animationControllerForOperation:(UINavigationControllerOperation)operation fromViewController:(UIViewController *)fromVC toViewController:(UIViewController *)toVC
{
if (UINavigationControllerOperationNone)
{
return nil;
}
if (operation == UINavigationControllerOperationPush)
{
self.transitionAnimator.type = AnimationTypePresent;
return self.transitionAnimator;
}
if (operation == UINavigationControllerOperationPop)
{
self.transitionAnimator.type = AnimationTypeDismiss;
return self.transitionAnimator;
}
return nil;
}
- (id<UIViewControllerInteractiveTransitioning>)navigationController:(UINavigationController
*)navigationController interactionControllerForAnimationController:(id<UIViewControllerAnimatedTransitioning>)animationController
{
return self.interactionController;
}
开始交互式转换的代码:
- (void)edgePanGestureBegan:(UIScreenEdgePanGestureRecognizer *)recognizer
{
if (!self.transitionCoordinator) {
self.interactionController = [UIPercentDrivenInteractiveTransition new];
[self popViewControllerAnimated:YES];
}
}
取消转换的代码:
[self.interactionController cancelInteractiveTransition];
以及我UIViewControllerContextTransitioning
对象中的相关代码:
- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext
{
UIView *containerView = [transitionContext containerView];
UIViewController *fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
UIViewController *toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
if (self.type == AnimationTypePresent) {
...
} else if (self.type == AnimationTypeDismiss) {
[containerView insertSubview:toViewController.view belowSubview:fromViewController.view];
[UIView animateWithDuration:[self transitionDuration:transitionContext]
animations:^{
CATransform3D transform = CATransform3DMakeScale(0.01, 0.01, 1.0);
fromViewController.view.layer.transform = transform;
}
completion:^(BOOL finished) {
[transitionContext completeTransition:!transitionContext.transitionWasCancelled];
}];
}
}