Ios 动画不';行不通

Ios 动画不';行不通,ios,animation,layer,Ios,Animation,Layer,我对动画有问题。 问题是,如果我尝试为已经创建的视图设置动画,一切都会顺利进行,如果我尝试在动画不起作用的同时创建视图并为其设置动画 有人能帮我吗 我的方法 + (LoginView *)sharedInstance { @synchronized(self) { if (nil == _sharedInstance) { _sharedInstance = (LoginView *)[[[NSBundle mainBundle] loadNibN

我对动画有问题。 问题是,如果我尝试为已经创建的视图设置动画,一切都会顺利进行,如果我尝试在动画不起作用的同时创建视图并为其设置动画

有人能帮我吗

我的方法

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

第一次(同一次呼叫)动画不起作用,从第二次开始一切顺利。提前感谢

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

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

总之,首先显示视图,然后对其调用
hide:animated:
方法

在您的评论之后:尝试通过以下方法调用
hide:animated:
方法:

 performSelector:withObject:afterDelay:
如果指定0.0延迟,这将在主循环中将调用
hide:animate:
排入队列,以便可以进行与
loadNibNamed:
相关的所有处理,从而为视图提供正确设置显示的时间


要使用
performSelect:withObject:afterDelay:
,您需要修改方法签名,使其包含一个参数,并且该参数必须是NSObject派生类型,而不是基元类型

您在哪里显示视图?例如执行
addSubview:[LoginView sharedInstance]
或其他操作?a)将其添加为视图或子视图的位置不可见,并且“同时创建和设置视图动画”不清楚b)您的单例实例可能设置为零,并且reallocated@A-Live-A)在默认情况下是隐藏的(我将其设置为“awakeFromNib”方法)。“同时创建和设置视图动画”意味着第一次调用hide方法时,我的应用程序将创建LoginView的新实例,并在创建结束时开始动画;第二次LoginView已经创建,因此无需创建,只能显示。B) 为什么我不能使用singleton?@sergio-我在创建视图时显示视图(在awakeFormNib方法中)。@Marco Pace当然可以,但考虑到多线程的使用,您最好确保它的安全。请检查我的编辑,您可能需要调用
性能选择器:withObject:afterDelay:
。非常感谢,它工作得非常完美——我学到了更多!最后:问题不在于我的self.layer为null,而是(经过一些阅读之后)每个UI方法都像“performSelector”方法上的包装器。在五月的案例中,我做了一个“hidden=no”,所以它是在动画结束后在我的方法结束时执行的。执行“performSelector”操作时,将动画放在hidde=no之后的队列中,因此它起作用:-)