【问题标题】:NSTimer scheduledTimerWithTimeInterval and CoreAnimation [duplicate]NSTimer scheduleTimerWithTimeInterval 和 CoreAnimation [重复]
【发布时间】:2013-06-01 08:57:55
【问题描述】:

我正在使用可可控件编写一个应用程序,该控件可以为文本设置动画,

https://www.cocoacontrols.com/controls/marqueelabel

它使用CoreTextQuartzCore

这是一个非常棒的控制,但我遇到了麻烦。 当实例化我使用控件创建的动画标签时立即开始滚动,但是我发现当我使用NSTimer 创建动画标签时它没有动画。 我正在使用

- (void)viewDidLoad
{

    [super viewDidLoad];

    ....
    [self.view addSubview:continuousLabel1];
    [NSTimer scheduledTimerWithTimeInterval:5
                                                target:self
                                              selector:@selector(updatePrice)
                                              userInfo:nil repeats:YES];


}

调用创建动画标签的方法,当我直接调用该方法时,标签会创建和动画,但是当使用上述预定计时器调用时,新标签仅在第一次调用时创建动画,而不是在计时器重复调用时到方法。 我已经检查过我的方法正在主线程/主运行循环上被调用,有什么想法吗?

为了清楚起见,工作流程是:

定时器调用方法 --> 标签 1 被创建并开始动画化。

晚了 5 秒...

定时器再次调用方法 --> 标签 2 已创建但是没有按预期开始动画。

编辑:

- (void)updatePrice
{


        MarqueeLabel *continuousLabel2 = [[MarqueeLabel alloc] initWithFrame:CGRectMake(10, 230, self.view.frame.size.width-20, 20) rate:100.0f andFadeLength:10.0f];
        continuousLabel2.tag = 101;
        continuousLabel2.marqueeType = MLContinuous;
        continuousLabel2.animationCurve = UIViewAnimationOptionCurveLinear;
        continuousLabel2.continuousMarqueeExtraBuffer = 50.0f;
        continuousLabel2.numberOfLines = 1;
        continuousLabel2.opaque = NO;
        continuousLabel2.enabled = YES;
        continuousLabel2.shadowOffset = CGSizeMake(0.0, -1.0);
        continuousLabel2.textAlignment = NSTextAlignmentLeft;
        continuousLabel2.textColor = [UIColor colorWithRed:0.234 green:0.234 blue:0.234 alpha:1.000];
        continuousLabel2.backgroundColor = [UIColor clearColor];
        continuousLabel2.font = [UIFont fontWithName:@"Helvetica-Bold" size:17.000];
        continuousLabel2.text = @"This is another long label that doesn't scroll continuously with a custom space between labels! You can also tap it to pause and unpause it!";

        [self.view addSubview:continuousLabel2];

    if( [NSThread isMainThread])
    {
        NSLog(@"In Main Thread");
    }
    if ([NSRunLoop currentRunLoop] == [NSRunLoop mainRunLoop]) {
        NSLog(@"In Main Loop");
    }


}

【问题讨论】:

  • 昨天我在marquee上给出了答案
  • 你读过这个问题吗?我确切地知道如何创建一个选取框,我的问题不是重复的,甚至与您建议的问题不太相似。当标签被 NSTimers 重复调用实例化时,标签上的动画无法发生。
  • 由于您的问题未在代码中显示,我认为答案会对您有所帮助。我看到的一个区别是我有一个属性启动并使计时器无效。在你的情况下,我不确定你从哪里和多少次调用myMethod....链接和欺骗可能与你想要的有 80-100% 的相似性。
  • Anoop,这就像我们在谈论完全不同的问题。[NSTimer scheduledTimerWithTimeInterval,每 5 秒调用一次 myMethod,而且您不必将其无效,因为它是一个类方法。]
  • 有人知道为什么当计时器重复触发时,选择器方法中的核心动画会失败吗?

标签: iphone ios objective-c core-animation nstimer


【解决方案1】:

问题是您每 5 秒调用一次updatePrice,并且在此方法中您正在创建一个新标签,该标签正在堆叠,并注意它会变得越来越暗5 秒。

如果您检查标签是否正在滚动。

解决办法:

如果您希望标签的多个实例更改其坐标。

如果您想要单个实例,请比较检查并只创建一次。

【讨论】:

  • 嗨阿努普!感谢您的帮助,现在您有了项目,您可以看到我的问题,我知道标签正在堆叠,如果您关闭计时器上的重复,它不会堆叠,没关系,因为这只是一个示例项目,我的问题是顶部标签正在滚动,但底部标签不为我滚动!查看此屏幕截图以了解我的意思,再次感谢您抽出宝贵时间...谢谢先生,i.imgur.com/J36jDb5.png
  • 这里我已经关闭了计时器的重复,但创建的第二个标签仍然没有动画!
  • 点击ios模拟器的按钮,然后点击app,就会开始动画了。
  • 我不喜欢 ios。但我想由于viewDidLoad 方法,请尝试将其拉出到其他方法。我猜计时器会触发一次。
【解决方案2】:

您应该阅读自述文件中的Important Animation Note 部分。

我的猜测是,您需要调用 controllerLabelsShouldAnimate: 并传递您当前的视图控制器,以动画显示视图控制器后添加的那些标签。

【讨论】:

  • 谢谢!你解决了我的问题!问题是 MarqueeLabel 基于 UIView 动画,当视图出现和消失时会导致一些问题,并且重复动画被 iOS 停止并且不会自动重新启动。在这种情况下,我没有更改视图,但以某种方式通过计时器添加标签似乎会导致动画问题。此代码'MarqueeLabel controllerViewAppearing:self];'解决了我的问题!谢谢!附言。 rptwsthi,很快,Roman C,Graviton 这个问题不是重复的。如果您花更多时间提供帮助,而花更少时间寻找您可能已经注意到的要点
  • yonosoytu - 我会赞成你的答案,但由于任意限制,我不能。也许将其标记为完全不相关问题的骗局的有用小伙子之一可能会为我投票。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多