NSTimer scheduledTimerWithTimeInterval和CoreAnimation

时间:2013-06-01 08:57:55

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

我正在使用动画文本的可可控件编写应用程序,

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


}

调用创建动画标签的方法,当我直接调用该方法时,标签创建并设置动画,但是当使用上面的预定计时器调用时,新标签仅在第一次调用时创建动画,而不是在定时器上重复调用方法。 我已经检查过我的方法是在主线程/主runloop上调用,有什么想法吗?

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

定时器调用方法 - >标签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");
    }


}

2 个答案:

答案 0 :(得分:2)

问题是你每隔5秒就会调用updatePrice,而在这种方法中你正在创建一个新的标签,即堆叠,并注意到它变暗了每5秒变暗一次。

如果你检查标签是否滚动。

解决方案:

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

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

答案 1 :(得分:1)

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

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