无法获得[[id Animator] setAlphaValue:0.0]工作

时间:2011-06-13 19:50:07

标签: objective-c cocoa macos animation

我正在尝试设置NSImageView的不透明度淡出+帧大小更改的动画。 frameSize工作顺利但由于某种原因,alpha值直接跳转到动画开头的最终值。我已经尝试过将超级视图分层,我在这里已经没有想法了。这是我的代码示例 - >

AABLCLogo   -> NSImageView IBOutlet
speed       -> 1.0f 

//setting target frame for image view

NSRect newFrame      = [AABLCLogo frame];
newFrame.origin.x    = newFrame.origin.x + (newFrame.size.width*0.1);
newFrame.origin.y    = newFrame.origin.y + (newFrame.size.height*0.1);
newFrame.size.width  = newFrame.size.width * 0.8;
newFrame.size.height = newFrame.size.height * 0.8;

//backing layer for super view

[[AABLCLogo superview] setWantsLayer:YES];

//animating image view

[NSAnimationContext beginGrouping];
[[NSAnimationContext currentContext] setDuration: speed];
[[AABLCLogo animator] setFrame: newFrame];
[[AABLCLogo animator] setAlphaValue: 0.0];
[NSAnimationContext endGrouping];

//XCode 4 delay snippet

double delayInSeconds   = speed;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, 
                                        delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, 
               dispatch_get_main_queue(), 
               ^(void) {

    //code executes after ''speed'' seconds

    [[AABLCLogo superview] setWantsLayer:NO];
    [[self view] removeFromSuperview];

                });

3 个答案:

答案 0 :(得分:0)

我怀疑这是主线程动画的问题。在大多数情况下,如果要同时制作两个动画,则需要使用NSViewAnimation。使用此代码作为指南,它会调整窗口大小,同时淡出部分内容。

NSRect newWindowFrame = NSMakeRect(self.window.frame.origin.x, self.window.frame.origin.y, 640, self.window.frame.size.height);
NSMutableArray *viewAnimations = [NSMutableArray array];
NSDictionary *windowSizeDict = [NSDictionary dictionaryWithObjectsAndKeys:self.window, NSViewAnimationTargetKey, [NSValue valueWithRect:newWindowFrame], NSViewAnimationEndFrameKey, nil];
[viewAnimations addObject:windowSizeDict];

NSDictionary *animateOutDict = [NSDictionary dictionaryWithObjectsAndKeys:self.dataSidebarController.containerView, NSViewAnimationTargetKey, NSViewAnimationFadeOutEffect, NSViewAnimationEffectKey, nil];
[viewAnimations addObject:animateOutDict];

NSViewAnimation *animation = [[NSViewAnimation alloc] initWithViewAnimations:viewAnimations];
[animation setDuration:0.35];
[animation setAnimationBlockingMode:NSAnimationNonblocking];
[animation setDelegate:self];
[animation startAnimation];

答案 1 :(得分:0)

您希望将 setWantsLayer:YES 发送到您正在设置动画的视图,而不是其超级视图。

NSView的setAlphaValue:仅适用于图层支持或图层托管实例,因为它会将值转发到NSView图层的不透明度属性。

有关完整的故事,请阅读Apple的文档中NSView的setAlphaValue的“讨论”。

答案 2 :(得分:0)

我相信在下次绘制视图之前,您创建的图层不会创建。

因此,您需要强制显示超级视图或等到运行循环的下一次迭代,然后再添加动画。