【发布时间】:2011-08-04 16:52:34
【问题描述】:
背景和目标
我在 IB 的 nib 文件中有一个窗口和三个单独的视图。这三个视图用于程序的三个“部分”:第一个是用户放置文件,第二个是选择一些选项,第三个是在程序完成任务时显示进度条。
我想在这些视图更改时在它们之间制作动画,并且我正在制作淡入/淡出动画。目标是让旧视图(即将消失的视图)在新视图淡入时淡出。视图具有不同的大小,因此我同时为窗口框架设置动画(这些视图填满窗户)。所有三个视图都在 IB 中启用了核心动画,但没有其他(例如窗口的内容视图)。
代码
在程序开始时,我注册了视图的大小以便以后可以使用它们,将视图添加到窗口并隐藏第 2 和第 3 视图。
- (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。我在这里也发现了很多与这个问题很接近但没有专门解决进度条问题的问题。
祝你好运找到解决方案:)
【问题讨论】:
标签: objective-c cocoa animation core-animation nsview