1

ビューに1つずつ表示されるラベルにマーキー効果を追加するための次のコードを作成しました。

- (void)marqueeMessage:(NSString *)messageString
{
UILabel *label = [[UILabel alloc] initWithFrame:(CGRectMake(520, 0, 480, 21))];
label.text = messageString;
[self.view addSubview:label];

[UIView animateWithDuration:0.2

                 animations:^ {

    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:20];
    [UIView setAnimationTransition:UIViewAnimationTransitionNone forView:self.view cache:YES];
    label.frame = CGRectMake(-480, 0, 480, 21);
    [UIView commitAnimations];
}
                 completion:^(BOOL finished) {

    NSLog(@"Animation Done!");
    if (array.count > 0)
    {
        nextIndex++;
        NSString *strMessage = [array objectAtIndex:nextIndex];
        [self marqueeMessage:strMessage];
    }
}];
}

どういうわけか、配列内の文字列は、アニメーションの実行中に重なるように表示されています。

どんなアイデアでも、誰でも?

さらに情報が必要な場合に備えて、私に知らせてください。

4

3 に答える 3

2
-(void)viewDidLoad {

    [super viewDidLoad];
    array=[[NSArray alloc]initWithObjects:@"Scroll test",@"Scroll test1",@"Scroll test2",@"Scroll test3",@"Scroll test4",nil];
    [self marqueeMessage:[array objectAtIndex:0]];
// Do any additional setup after loading the view, typically from a nib.
}

- (void)marqueeMessage:(NSString *)messageString {
    label = [[UILabel alloc] initWithFrame:(CGRectMake(0, 50, 90, 21))];
    //label.tag=nextIndex;
    label.text = messageString;
    [self.view addSubview:label];
    [UIView beginAnimations:@"LBL" context:nil];
    [UIView setAnimationDuration:3];
    [UIView setAnimationDidStopSelector:@selector(performThis:)];
    [UIView setAnimationDelegate:self];

    label.frame = CGRectMake(360,50,90,21);
    [UIView commitAnimations];
}

- (void) performThis:(id) sender {
    if (i<[array count]) {
        label.text = [array objectAtIndex:i];
        i++;
    }
    else
    {
        i=0;
        label.text = [array objectAtIndex:i];
    }
    label.frame = CGRectMake(-90,50,90,21);
    [UIView beginAnimations:@"LBL" context:nil];
    [UIView setAnimationDuration:3];
    label.frame = CGRectMake(360,50,90,21);
    [UIView setAnimationDelegate:self];
    [UIView setAnimationDidStopSelector:@selector(performThis:)];
    [UIView commitAnimations];
}

あなたを助けるかもしれません。

于 2012-08-30T04:03:50.507 に答える
0

スーパービューからラベルを削除することは決してないと思います...ラベルを参照し続ける必要があります:

[old_label removeFromSuperview];
于 2012-08-29T12:22:59.550 に答える
0

最初のアニメーション(0.2秒続く)が終了し、完了が呼び出されて、20秒間続くため、画面上に残っているネストされたアニメーションの上に、ビューに別のラベルが追加されているように見えます。など。重複するラベルの山になってしまいます。

于 2012-08-29T12:47:38.707 に答える