我遇到动画问题。 问题是,如果我尝试为已经创建的视图设置动画,那么一切顺利,如果我尝试在动画不起作用的同时创建和动画视图。
任何人都可以帮助我吗?
我的方法
+ (LoginView *)sharedInstance {
@synchronized(self) {
if (nil == _sharedInstance) {
_sharedInstance = (LoginView *)[[[NSBundle mainBundle] loadNibNamed:@"LoginView" owner:nil options:nil] objectAtIndex:0];
}
}
return _sharedInstance;
}
- (void)hide:(BOOL)value animated:(BOOL)animated {
CATransition * animation = [CATransition animation];
animation.type = kCATransitionFade;
[animation setDuration:1.0];
if(_autoManageModalView)
[animation setDelegate:self];
[[self layer] removeAllAnimations];
[[self layer] addAnimation:animation forKey:kCATransition];
self.hidden = value;
}
我如何称呼他们
[[LoginView sharedInstance] hide:NO animated:YES];
第一次(使用相同的调用)动画不起作用,从第二次开始一切顺利。提前谢谢!
答案 0 :(得分:2)
您在其生命周期中过早地制作视图动画。理论上,您创建一个视图,然后将其显示在某个地方(例如,addSubview:
),然后为其设置动画。
尽管我没有检查过,但很有可能第一次调用hide:animated:
方法时self.layer
属性为null;在任何情况下,动画都会在显示视图之前发生,所以你不会看到它。
总而言之,首先显示视图,然后在其上调用hide:animated:
方法。
发表评论后:尝试通过以下方法调用hide:animated:
方法:
performSelector:withObject:afterDelay:
如果你指定0.0延迟,这只会在主循环上将调用排队到hide:animate:
,这样就可以发生与loadNibNamed:
相关的所有处理,从而为你的视图提供时间设置正确显示。
为了使用performSelector:withObject:afterDelay:
,您需要修改方法签名,以便它接受一个参数,这必须是NSObject派生类型,而不是基本类型。