微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

无法使[[id Animator] setAlphaValue:0.0]起作用

如何解决无法使[[id Animator] setAlphaValue:0.0]起作用

| 我正在尝试制作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];

                });
    

解决方法

        我怀疑这是在主线程上设置动画的问题。在大多数情况下,如果要同时对两件事进行动画处理,则需要使用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,NSViewAnimationFadeOutEffect,NSViewAnimationEffectKey,nil];
[viewAnimations addObject:animateOutDict];

NSViewAnimation *animation = [[NSViewAnimation alloc] initWithViewAnimations:viewAnimations];
[animation setDuration:0.35];
[animation setAnimationBlockingMode:NSAnimationNonblocking];
[animation setDelegate:self];
[animation startAnimation];
    ,        您想将setWantsLayer:YES发送到要设置动画的视图,而不是其父视图。 NSView \的setAlphaValue:仅适用于支持图层或承载图层的实例,因为它将值转发给NSView图层的opacity属性。 有关全文,请阅读Apple文档中NSView的setAlphaValue:的“讨论”。     ,        我认为您请求的图层直到下一次绘制视图时才创建。 因此,您需要强制显示超级视图,或者等到运行循环的下一个迭代再添加动画。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。