动画不起作用

时间:2012-06-05 08:26:06

标签: ios animation layer

我遇到动画问题。 问题是,如果我尝试为已经创建的视图设置动画,那么一切顺利,如果我尝试在动画不起作用的同时创建和动画视图。

任何人都可以帮助我吗?

我的方法

+ (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];

第一次(使用相同的调用)动画不起作用,从第二次开始一切顺利。提前谢谢!

1 个答案:

答案 0 :(得分:2)

您在其生命周期中过早地制作视图动画。理论上,您创建一个视图,然后将其显示在某个地方(例如,addSubview:),然后为其设置动画。

尽管我没有检查过,但很有可能第一次调用hide:animated:方法时self.layer属性为null;在任何情况下,动画都会在显示视图之前发生,所以你不会看到它。

总而言之,首先显示视图,然后在其上调用hide:animated:方法。

发表评论后:尝试通过以下方法调用hide:animated:方法:

 performSelector:withObject:afterDelay:

如果你指定0.0延迟,这只会在主循环上将调用排队到hide:animate:,这样就可以发生与loadNibNamed:相关的所有处理,从而为你的视图提供时间设置正确显示。

为了使用performSelector:withObject:afterDelay:,您需要修改方法签名,以便它接受一个参数,这必须是NSObject派生类型,而不是基本类型。