【问题标题】:Animation doesn't work动画不起作用
【发布时间】:2012-06-05 08:26:06
【问题描述】:

我的动画有问题。 问题是,如果我尝试为已创建的视图设置动画,一切顺利,如果我尝试同时创建视图并为其设置动画,则动画将不起作用。

谁能帮帮我?

我的方法

+ (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:[LoginView sharedInstance] 或其他什么?
  • a) 在您将其添加为视图或子视图的位置不可见,并且“同时创建和动画视图”不清楚 b) 您的单例实例可能设置为 nil 并重新分配
  • @A-Live - A) 默认隐藏(我将其设置为“awakeFromNib”方法)。 “同时创建和动画视图”意味着第一次调用 hide 方法时,我的应用程序会创建一个 LoginView 的新实例,并以创建结束,它应该开始动画;第二次 LoginView 已经创建,所以不需要创建它,它必须只显示。 B) 为什么我不能使用单例?
  • @sergio - 我在创建视图时显示视图(在 awakeFormNib 方法中)。
  • @Marco Pace 当然可以,但考虑到多线程的使用情况,最好让它安全。

标签: ios animation layer


【解决方案1】:

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

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

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

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

 performSelector:withObject:afterDelay:

如果您指定 0.0 延迟,这将简单地在主循环中对 hide:animate: 的调用进行排队,以便与 loadNibNamed: 相关的所有处理都可以发生,从而为您的视图设置显示时间正确。

为了使用performSelector:withObject:afterDelay:,你需要修改你的方法签名,让它接受一个参数,并且这必须是一个NSObject派生的类型,而不是一个原始类型。

【讨论】:

  • 请检查我的编辑,您可能需要致电performSelector:withObject:afterDelay:
  • 非常感谢,它运行良好 - 我学到了更多东西!
  • 结束它:问题不在于我的 self.layer 为空,问题(经过阅读后)是每个 UI 方法都像“performSelector”方法的包装器。在可能的情况下,我做了一个“hidden = no”,所以它是在动画结束后我的方法结束时执行的。执行“performSelector”将动画放在隐藏 = 否之后的队列中,所以它起作用了:-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-03
  • 2017-08-18
  • 2018-09-27
  • 2011-02-01
  • 2014-08-09
相关资源
最近更新 更多