如何使用CATransition在Cocoa中切换视图控制器?

时间:2011-10-17 06:01:56

标签: objective-c cocoa core-animation

我有一个Mac应用程序,想在两种类型的视图之间切换,从详细视图编辑视图

两者都有自己的视图控制器,当加载DetailViewController时,我希望能够在按钮上加载EditViewController。到目前为止没有问题。

但我也想使用CATransition或类似内容从右侧滑入EditViewController幻灯片,而DetailViewController向左滑动。就像图像轮播一样。

如何修改当前代码以支持此转换效果? (QuartzCore已在项目中导入)

- (IBAction)edit:(id)sender {
    // NOTE: self is a DetailViewController
    EditViewController *editController = [[EditViewController alloc] 
            initWithNibName:@"EditView" bundle:nil];
    [editController.view setFrame:self.view.frame];
    [self.view addSubview:editController.view];
}

1 个答案:

答案 0 :(得分:-1)

我为iPhone做了类似的事情。但是,校长应该非常相似。在下面的代码示例中,将UIView更改为NSView,依此类推。

首先,您需要一个根视图控制器来处理细节和编辑之间的交换。

在其中,有一个像这样的方法。传递给该方法的旧视图和新视图是属于旧视图控制器和新视图控制器的view ivars:

- (void) slideInNewViewFromRight:(UIView *)newView oldView:(UIView *)oldView remove:(BOOL)remove
{
    UIView *superView = [oldView superview];

    [superView insertSubview:newView belowSubview:oldView];

    CGRect oldFrame = [oldView frame];
    oldFrame.origin = CGPointMake(-kScreenWidth, 0.0f);

    CGRect newFrame = [newView frame];
    newFrame.origin = CGPointMake(kScreenWidth, 0.0f);
    newView.frame = newFrame;

    newFrame.origin = CGPointMake(0.0f, 0.0f);

    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseIn];
    [UIView setAnimationDuration:kSlideOffDuration];
    [UIView setAnimationDelegate:self];

        if (remove) {
            [self setViewToRemove:oldView];
            [UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:context:)];
        }

        [oldView setFrame:oldFrame];
        [newView setFrame:newFrame];

    [UIView commitAnimations];
}

animationDidStop委托方法将在view完成后处理从superview删除旧版- (void) animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context { [viewToRemove removeFromSuperview]; }

#define kScreenWidth                    320.0f
#define kSlideInDuration                0.2f

不要忘记常数:

UITabBarController

可能有人在想,我为什么不使用UINavigationControllerCATransition这样做?答案是,由于我的视图控制器的非分层结构,在我的情况下都没有意义。事实上,我的网络更像网络。因此,我使用自定义根视图控制器处理所有内容。

至于{{1}},我从未使用过它。我很想知道更多关于它的应用程序,以及它是否能为这个问题提供更优雅的解决方案。