0

コンパスを作ろうとしています。

基本的に、コンパスの方向として、コンパスの針のイメージを使用します。ビューを切り替えるか、別のビューを追加するまで(たとえば、UIActionViewまたは別のビューコントローラーに切り替える)、コンパスの中心の周りでうまくアニメーション化されています。

    - (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading{

            float oldRadian = (-manager.heading.trueHeading *M_PI /180.0f);
            float newRadian = (-newHeading.trueHeading *M_PI /180.0f);

            CABasicAnimation *animation;
            animation=[CABasicAnimation animationWithKeyPath:@"transform.rotation"];
            animation.fromValue = [NSNumber numberWithFloat:oldRadian];
            animation.toValue = [NSNumber numberWithFloat:newRadian];
            animation.duration = 0.5f;

            [compassArrow.layer addAnimation:animation forKey:@"animateMyRotation"];
            compassArrow.transform = CGAffineTransformMakeRotation(newRadian);
}

この後、私は別のView Controllerに切り替えています.compassArrow imageviewは、アニメーション化され、浮かび始めました。

なぜこれが起こるのか考えはありますか??

4

5 に答える 5

2

コンパスの矢印の中心をコンパスの中心として設定します

compassArrow.center = CompassImage.center;

これがお役に立てば幸いです

于 2012-11-26T05:13:12.120 に答える
1

imageViewcompassArrowのアンカーポイントを設定します。アンカーポイントに従って回転するようにします。

使用する compassArrow.layer.anchorPoint = CGPointMake(0.5, 0.5);

私があなたを助けることを願っています.....

于 2012-11-26T04:48:39.790 に答える
0

ビューを変更する前に removeFromSuperlayer-method を使用して解決しました。問題は、同じキー (@"animateMyRotation") に対して複数のアニメーションを作成したことです。

[compassArrow.layer removeFromSuperlayer];
于 2012-11-27T07:18:41.097 に答える
0

切り替え前後のフレームをチェックして、それらが同じであるかどうかを確認してください。それらが同じでない場合は、どこかでフレームを間違って設定していることを意味します。ビューの切り替え前後でフレームが同じである場合、レイヤーに問題があります。変換.どこかで、アンカーポイントまたはレイヤーの場所を変更した可能性があります.

更新される場所を見つけ、ブレークポイントを使用し、制御フローに従い、フレームが更新される場所を追跡します。xcode のデバッグ コンソールの上にあるステップ イン ボタンを見つけることができます。

于 2012-11-26T09:36:23.667 に答える
0

最初に画像ビュー フレームを取得します。そのためにはNSLog(@"%f %f %f %f", compassArrow.frame.origin.x,compassArrow.frame.origin.y,compassArrow.frame.size.width,compassArrow.frame.size.height);、viewDidLoad を入力できます。フレームをメモします。次に、viewWillAppear メソッドで、行を追加します。

-(void)viewWillAppear:(BOOL)animated{

   [super viewWillAppear:YES];
   [compassArrow setFrame:CGRectMake(CMPASSARROWFRAME.x, CMPASSARROWFRAME.y, CMPASSARROWFRAME.width, CMPASSARROWFRAME.height)];
}

この「CMPASSARROWFRAME」はフレームのフレームであることに注意してくださいcompassArrow

于 2012-11-26T07:19:00.633 に答える