2011-08-04 48 views
2

背景&目标动画效果兄弟NSViews

我有一个窗口,并在IB一个笔尖文件中的三个sepearate意见。这三个视图用于程序的三个“部分”:第一个是用户删除文件,第二个用于选择某些选项,第三个用于在程序完成任务时显示进度条。

我想在这些视图之间动画,因为它们会改变,我正在做一个淡入/淡出动画。目标是让旧视图(即将消失的视图)在新视图淡入时淡出。视图具有不同的大小,因此我同时对窗框进行了动画处理(这些视图填满了窗口)。所有这三个视图都在IB中启用了核心动画,但没有其他任何内容(例如窗口的内容视图)。

代码

在节目的一开始,我登记的意见的大小,所以我可以在以后使用它们,视图添加到窗口,并设置在第二和第三视图隐藏。

- (void)awakeFromNib 
{ 
    // Register native views' size (when they get displayed again the window can be set to their bounds) 
    view1NativeSize = [firstView bounds].size; 
    view2NativeSize = [secondView bounds].size; 
    view3NativeSize = [thirdView bounds].size; 

    // Add views to the main window's content view 
    NSRect viewFrame = [[mainWindow contentView] bounds]; 
    [firstView setFrame: viewFrame]; 
    [secondView setFrame: viewFrame]; 
    [thirdView setFrame: viewFrame]; 

    [[mainWindow contentView] addSubview: firstView]; 
    [[mainWindow contentView] addSubview: secondView]; 
    [[mainWindow contentView] addSubview: thirdView]; 

    // Set their attributes 
    [secondView setHidden: TRUE]; 
    [thirdView setHidden: TRUE]; 

    currView = 1; 
} 

然后,我有三种方法交换视图之间,我计算新的窗口框架和调用动画的方法。

- (IBAction)goToFirstView: (id)sender 
{   
    NSRect newFrame = [mainWindow frame]; 
    newFrame.size = view1NativeSize; 
    newFrame.size.height += [self titleBarHeight]; // Method that returns the title bar height 

    if (currView == 1) { 
     return; 
    } 
    else if (currView == 2) { 
     [self animateFromView: secondView toView: firstView andWindowFrame: newFrame]; 
     currView--; 
    } 
    else if (currView == 3) { 
     [self animateFromView: thirdView toView: firstView andWindowFrame: newFrame]; 
     currView -= 2; 
    } 
} 
- (IBAction)goToSecondView: (id)sender 
{ 
    NSRect newFrame = [mainWindow frame]; 
    newFrame.size = view2NativeSize; 
    newFrame.size.height += [self titleBarHeight]; 

    if (currView == 2) { 
     return; 
    } 
    else if (currView == 1) { 
     [self animateFromView: firstView toView: secondView andWindowFrame: newFrame]; 
     currView++; 
    } 
    else if (currView == 3) {   
     [self animateFromView: thirdView toView: secondView andWindowFrame: newFrame]; 
     currView--; 
    } 
} 
- (IBAction)goToThirdView: (id)sender 
{ 
    NSRect newFrame = [mainWindow frame]; 
    newFrame.size = view3NativeSize; 
    newFrame.size.height += [self titleBarHeight]; 

    if (currView == 3) { 
     return; 
    } 
    else if (currView == 1) { 
     [self animateFromView: firstView toView: thirdView andWindowFrame: newFrame]; 
     currView += 2; 
    } 
    else if (currView == 2) { 
     [self animateFromView: secondView toView: thirdView andWindowFrame: newFrame]; 
     currView++; 
    } 
} 

为动画的方法是非常简单的。我使观点动画化。

- (void)animateFromView: (NSView*)oldView 
       toView: (NSView*)newView 
     andWindowFrame: (NSRect)newWindowFrame 
{ 
    [NSAnimationContext beginGrouping]; 
    [[NSAnimationContext currentContext] setDuration: 0.5]; 

    [[newView animator] setHidden: FALSE]; 
    [[oldView animator] setHidden: TRUE]; 
    //[[mainWindow animator] setFrame: newWindowFrame]; --Doesn't work?? 

    [NSAnimationContext endGrouping]; 

    [mainWindow setFrame: newWindowFrame display: YES animate: YES]; 
} 

问题

我有两个问题(最重要的第一次):

  • 在第三个观点是有进度指示器,它从来没有正确显示。它不更新!我打电话给-startAnimation:但它根本不动。如果我在第三层关闭CA,它不会正确淡入/淡出,但进度条开始工作(动画)。不知道为什么......

  • 在我无数次的实验试图解决我试图打开CA为窗口的内容查看和关闭CA三个子视图的第一个问题。第一个问题没有解决,但我注意到了一些东西:这样,随着新视图淡入,旧视图逐渐消失,而在此变化之前(与CA的子视图),我只能注意到新视图渐渐消失。并在sloooowww-moootion中观看它:)发现我是对的:旧视图奇迹般地消失了,我所看到的只是新的视图淡入。这很有趣,我只是在看完我真正想要的动画后才发现。我是否应该将CA仅分别用于内容视图或所有三个子视图? (或者是别的什么这个问题?)

我试着像打开CA进度条很多东西。我在这里发现了很多接近这个问题的问题,但没有具体解决进度条问题。

祝你好运找到一个解决方案:)

回答

0

处理您的淡入淡出,你可以只使用一个CATransition作为this answer但你不会需要设置过渡类型,因为它是默认的交叉淡入淡出解释。

我怕我没有进度条问题的答案,虽然,它可能是与你正在做的淡入淡出的非正统的方式。

+0

我试过这个解决方案:只在-awakeFromNib上添加第一个视图并将其替换为过渡。进度条仍然不起作用,并且在某些转换后,视图开始显示在左侧或下侧。我不知道这是否因为我在同一时间改变窗框。无论如何,我不认为这会做... – Alex