0

更新
テキスト行を実行したいのですが、どちらの方法で作成するのが良いですか?

 -(void)viewDidLoad
    {
         CGSize mySize = CGSizeZero;
            mySize = [kGrindFMRunningText sizeWithFont:[UIFont fontWithName:@"Verdana" size:16]  constrainedToSize:CGSizeMake(4000, 30) lineBreakMode:UILineBreakModeWordWrap];

        runningText = [[UIScrollView alloc] initWithFrame:CGRectMake(60, -5, 260, 50)];
            grind_fm_text = [[UILabel alloc] initWithFrame:CGRectMake(0, 15, mySize.width, 30)];
            [grind_fm_text setUserInteractionEnabled:NO];
            [grind_fm_text setBackgroundColor:[UIColor clearColor]];
            [grind_fm_text setTextColor:[UIColor whiteColor]];
            [grind_fm_text setFont:[UIFont fontWithName:@"Verdana" size:16]];
            [grind_fm_text setText:kGrindFMRunningText];
            [runningText addSubview:grind_fm_text];
            [grind_fm_text release];
            [self animate];
    }


       - (void)animate
{
    [UIView animateWithDuration:10.0 delay:0. options:UIViewAnimationOptionCurveLinear|UIViewAnimationOptionBeginFromCurrentState animations:^{
        grind_fm_text.frame = CGRectMake(-grind_fm_text.frame.size.width, 15, grind_fm_text.frame.size.width, grind_fm_text.frame.size.height);
        // Do your animation in one direction until text is gone
    } completion:^(BOOL finished){
        grind_fm_text.frame = CGRectMake(260, 15, grind_fm_text.frame.size.width, grind_fm_text.frame.size.height); 
        // Move scroll position back to original position
        [self animate]; // Then call animate again to repeat
    }];
}

-(void)songChange
{
    CGSize mySize = CGSizeZero;
    mySize = [result sizeWithFont:[UIFont fontWithName:@"Verdana" size:16]  constrainedToSize:CGSizeMake(4000, 30) lineBreakMode:UILineBreakModeWordWrap];
    grind_fm_text.frame = CGRectMake(grind_fm_text.frame.origin.x, 15, mySize.width, 30);
    grind_fm_text.text = result;;
    [self animate];
}

- (void)startStopStream {
        [streamer stop];
        //[bufferIndicator stopAnimating];
        [CATransaction begin];
        [self.view.layer removeAllAnimations];
        [CATransaction commit];
        grind_fm_text.text = kGrindFMRunningText;
        CGSize mySize = CGSizeZero;
        mySize = [kGrindFMRunningText sizeWithFont:[UIFont fontWithName:@"Verdana" size:16]  constrainedToSize:CGSizeMake(4000, 30) lineBreakMode:UILineBreakModeWordWrap];
        grind_fm_text.frame = CGRectMake(grind_fm_text.frame.origin.x, 15, mySize.width, 30);
        [self animate];
}

[CATransaction begin]; [myView.layer removeAllAnimations]; [CATransaction commit];私にはうまくいきません。UIViewAnimationOptionCurveLinear|UIViewAnimationOptionBeginFromCurrentState奇妙に動作します。最初に、私が見ているように完了ブロックを実行しないか、おそらく実行しますが、アニメーションは再開されません。また、ボタンをクリックしても何も起こりませんが、2回クリックすると、アニメーションは別の方向から始まり、フリーズするまで遅くなります。

4

1 に答える 1

1

ネストされた UIView アニメーション ブロックを使用すると、これをより簡単に実行できるはずです。アニメーションブロックでは一方向にスクロールし、完了ブロックでは反対方向にスクロールし、そのアニメーションの完了ブロックではアニメーション関数をもう一度呼び出して繰り返すようにします。

このようなもの:

- (void)animate
{
    [UIView animateWithDuration:10.0 delay:0. options:UIViewAnimationOptionCurveLinear animations:^{
        // Do your animation in one direction
    } completion:^(BOOL finished){
        [UIView animateWithDuration:10.0 delay:0. options:UIViewAnimationOptionCurveLinear animations:^{
            // Do your animation in the other direction
        } completion:^(BOOL finished){
            [self animate];
        }];
    }];
}

または、最後までスクロールしたい場合は、次のようにもう一度実行します。

- (void)animate
{
    [UIView animateWithDuration:10.0 delay:0. options:UIViewAnimationOptionCurveLinear animations:^{
        // Do your animation in one direction until text is gone
    } completion:^(BOOL finished){
        // Move scroll position back to original position
        [self animate]; // Then call animate again to repeat
    }];
}

デフォルトでは、アニメーションはUIViewAnimationOptionCurveEaseInOutアニメーションオプションを使用するようです。UIViewAnimationOptionCurveLinearオプションが必要です。上記のコードを更新して、それを含めました。


この質問への回答によると: UIView アニメーションをキャンセルしますか? [myView.layer removeAllAnimations];myView がアニメーション化されているスクロール ビューである場所を呼び出すことで、アニメーションをキャンセルできるはずです。<QuartzCore/QuartzCore.h>CALayer メソッドにアクセスするには、必ず上部にインポートしてください。

編集:次の実行ループの反復後ではなく、すぐに実行されるようにするために、次のように呼び出す必要がある場合があります。

[CATransaction begin];
[myView.layer removeAllAnimations];
[CATransaction commit];

または、それでもうまくいかない場合は、UIView メソッド呼び出しのオプション パラメータを変更するだけでうまくいくUIViewAnimationOptionCurveLinear|UIViewAnimationOptionBeginFromCurrentStateはずです。removeAllAnimations を呼び出す必要はありません。実際に、まずそれを試してみてください。

于 2012-05-19T20:32:47.610 に答える