使用iOS 7 UIViewController转场动画,通过超过1个segue取消 unwind 操作

4
我正在使用iOS7中引入的UIViewController动画转换。我能够通过segue等方式来回产生一些非常好的转换效果。
请看下面的图片: enter image description here 如果只是一个segue/vc,我可以非常容易地来回切换。例如,如果我从屏幕1到屏幕2,动画效果就很完美。然后,如果我返回到1或前进到3,它也能完美地工作。
但是,如果你注意到屏幕4底部有一个名为“Back To Screen 1”的按钮——这是一个到屏幕1的反向segue。问题是,我无法使转换动画起作用。实际上,委托方法从未被调用过。
以下是我的设置方式(例如从屏幕2到3的动画):
//This is found in screen 2's view controller .m

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{

    if ([segue.identifier isEqualToString:@"screen2to3"]) {

        UIViewController *destination = segue.destinationViewController;
        destination.transitioningDelegate = self;
        destination.modalTransitionStyle = UIModalPresentationCustom;

    }
}

- (id<UIViewControllerAnimatedTransitioning>)animationControllerForPresentedController:(UIViewController *)presented presentingController:(UIViewController *)presenting sourceController:(UIViewController *)source {

    STSlideAnimation *animator = [STSlideAnimation new];
    animator.presenting = YES;
    return animator;
}

- (id<UIViewControllerAnimatedTransitioning>)animationControllerForDismissedController:(UIViewController *)dismissed {

    STSlideAnimation *animator = [STSlideAnimation new];
    return animator;
}

//This is the unwinding segue action

-(IBAction)returnToScreen2:(UIStoryboardSegue *)segue{

}

无论是从屏幕3返回到屏幕2,还是从屏幕2返回,都能完美地运行该动画。这个动画可以双向调用。然而,当一次返回多个vc时,我无法让任何动画工作。有什么想法吗?如果需要更多示例代码,请告诉我。


如果您正在进行全屏过渡,无需使用 destination.modalTransitionStyle = UIModalPresentationCustom;,请尝试改用 destination.modalTransitionStyle = UIModalPresentationFullScreen; - Mike Pollard
@MikePollard 其实,如果您查看可用的示例代码(如果我没有弄错,是苹果自己的示例代码),有必要将 modalTransitionStyle 设置为 custom,这样它就知道要寻找 transitioningDelegate 等内容。 - daveMac
不,这是不正确的。你可以很愉快地为全屏模态展示提供一个 transitioningDelegate。UIModalPresentationCustom和UIModalPresentationFullScreen之间的区别在于,当使用UIModalPresentationCustom时,呈现视图控制器不会被移除,并且在转换结束后可以看到其“在后面”的呈现视图控制器。 - Mike Pollard
@MikePollard 你说得对。我刚刚测试了一下。然而,这并没有改变或解决我的问题。 - daveMac
@MikePollard 我认为是这样。无论我尝试了什么,它甚至不会尝试从4动画回到1。然而,4可以毫无问题地返回到3。我相信问题在于有一个模态呈现控制器的层次结构。如果它们一次遍历一个,那就没有问题,但当遍历多个时,似乎会忽略动画代码。 - daveMac
显示剩余4条评论
1个回答

2

你需要为每种类型的过渡效果制作自定义转场类

#import <UIKit/UIKit.h>

@interface CustomSegue : UIStoryboardSegue

@end


@implementation CustomSegue

 -(void)perform {

 // write your transition code here
 // this code will be called every time transition is made

}

选择storyboard中的转场 - 在属性检查器中将其类型更改为自定义 - 选择你在上面创建的自定义类 "CustomSegue"。


如果你已正确地创建了子类,则会在属性检查器中看到如下所示:


Segue Inspector

像往常一样进行反向转场,但即使从第四个控制器弹出到第一个控制器,也会得到相同的效果。


我不确定你能否在那里编写转场代码。我在网上看到过几篇文章提到这一点,但当我自己实现时,发现它们会导致视图控制器无法正常工作的问题。此外,如果你可以在segues中简单地编写转场动画代码,为什么苹果要在iOS 7中引入视图控制器转场呢? - daveMac
让我进一步澄清我的意思,有很多教程可以向你展示如何编写自定义动画过渡效果。问题在于会产生一些不必要的副作用。请查看此教程并向下滚动到评论部分,以了解我所指的内容:http://dadabeatnik.wordpress.com/2013/10/13/custom-segues/comment-page-1/#comment-479 - daveMac

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接