如何编写在视图控制器之间“滑动”的自定义segue?

时间:2012-01-04 14:17:37

标签: ios segue

我使用故事板构建了一个应用程序,其初始视图控制器连接到许多后续视图控制器,使用交叉溶解segue顺序连接。这些工作一挥。一切正常。但是,我不想被迫使用基本的segue,而是希望有一个自定义的segue,可以将视图控制器内容滑入和移出屏幕,就像推送导航控制器一样,但是,可以左右移动,具体取决于是否一个是在应用程序中前进或后退。

我已将segue设置为custom,并创建并保存了MySegue.h文件。但是,我不知道如何对一个自定义segue进行编码,当我在视图控制器之间移动时,另一个视频控制器会将一个视图控制器从屏幕上滑下来,而另一个则来回滑动。

任何人都可以请我提供编码(应该很容易!),通过滑动屏幕打开和关闭自定义segue从一个视图控制器移动到下一个和后面,所以我不必使用基本Xcode 4.2中提供的交叉溶解或标准翻转?我将非常感激。

3 个答案:

答案 0 :(得分:4)

我在这里遇到了同样的问题,但是我使用滑动手势从一个视图控制器转到另一个视图控制器。使用故事板本身设置segues工作正常,但是当我需要滑动“返回”前一个视图控制器时,动画从右到左,而不是从左到右。为了解决这个问题,我做了以下几点:

  1. 在根视图控制器中嵌入导航控制器。
  2. 使用segues推送新的视图控制器。
  3. 当我想“返回”前一个视图控制器时,我没有在故事板上添加一个segue来推送前一个视图控制器。相反,每当发生反向滑动时,我都会调用导航控制器的popViewControllerAnimated方法。

答案 1 :(得分:2)

要创建滑动视图控制器的自定义segue,首先要创建一个扩展UIStoryboardSegue的类,然后覆盖执行选择器。我刚刚制作了这样的东西,它也适合你。这是我的代码:

#define kAnimationDuration 0.5

#import "CustomSlideSegue.h"

@implementation CustomSlideSegue

- (void)perform
{
    UIViewController *sourceViewController = (UIViewController *) self.sourceViewController;
    UIViewController *destinationViewController = (UIViewController *) self.destinationViewController;

    [sourceViewController.view addSubview:destinationViewController.view];
    [destinationViewController.view setFrame:sourceViewController.view.window.frame];

    [destinationViewController.view setBounds:sourceViewController.view.bounds];
    CGSize screenSize = [[UIScreen mainScreen] bounds].size;

    if ( !self.slideLeft ) {
        [UIView animateWithDuration:kAnimationDuration
                              delay:0.0
                            options:UIViewAnimationOptionCurveEaseOut
                         animations:^{
                             [destinationViewController.view setCenter:CGPointMake(screenSize.height + screenSize.height/2, screenSize.height/2 - 138)];
                             [destinationViewController.view setCenter:CGPointMake(screenSize.width/2 + 127, screenSize.height/2 - 138)];
                         }
                         completion:^(BOOL finished){
                             [destinationViewController.view removeFromSuperview];
                             [sourceViewController presentViewController:destinationViewController animated:NO completion:nil];
                         }];
    } else {
        [UIView animateWithDuration:kAnimationDuration
                              delay:0.0
                            options:UIViewAnimationOptionCurveEaseOut
                         animations:^{
                             [destinationViewController.view setCenter:CGPointMake(-1*screenSize.height/2, screenSize.height/2 - 138)];
                             [destinationViewController.view setCenter:CGPointMake(screenSize.width/2 + 127, screenSize.height/2 - 138)];
                         }
                         completion:^(BOOL finished){
                             [destinationViewController.view removeFromSuperview];
                             [sourceViewController presentViewController:destinationViewController animated:NO completion:nil];
                         }];
    }
}

然后当你想执行segue时使用这段代码:

   UIViewController *destination = [self.storyboard instantiateViewControllerWithIdentifier:@"some identifier"];
   CustomZoomSegue *segue = [[CustomZoomSegue alloc] initWithIdentifier:@"segue vc identifier" source:self destination:destination];
   [self prepareForSegue:segue sender:self];
   [segue perform];

CGPointMake调用是我自己的代码(我使用横向),但您应该能够根据自己的需要进行更改。如果您需要进一步澄清或有任何问题让我知道,我会尽力回答。

注意:我在视图控制器之间使用没有segue线的故事板。

答案 2 :(得分:0)

为什么不使用UINavigationController?这似乎正是它们的设计目标。