背景&目标动画效果兄弟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进度条很多东西。我在这里发现了很多接近这个问题的问题,但没有具体解决进度条问题。
祝你好运找到一个解决方案:)
我试过这个解决方案:只在-awakeFromNib上添加第一个视图并将其替换为过渡。进度条仍然不起作用,并且在某些转换后,视图开始显示在左侧或下侧。我不知道这是否因为我在同一时间改变窗框。无论如何,我不认为这会做... – Alex