7

self.myImage中心点を中心に回転させたいUIImageView ( ) 内に透明な png があります。コードは非常に単純です。

[self.myImage.layer setAnchorPoint:CGPointMake(0.5, 0.5)];
[UIView animateWithDuration:1.0 animations:^{
    [self.myImage setTransform:CGAffineTransformMakeRotation(angle)];
}];

画像は適切な速度/時間で適切な角度で回転しますが、位置がずれます。何が起こっているかの例を次に示します。

ここに画像の説明を入力

灰色の四角は、画面内の位置を示すためのものです。透明な png (UIImageView に含まれる) は、もう一方の図です。白い点線は、UIImageView の中心を示しています。画像の左側は画像の元の位置を示し、右側は上記のコードで回転させた後の画像を示します (少し右にずらします)。白黒の円は画像ファイルの中央にあります。

私が見逃しているものはありますか?私の知る限り、上記の最初の行はデフォルトであるため、必要ありません。ストーリーボード/プログラムで何かを設定/設定解除する必要がありますか?

4

2 に答える 2

13

このコードを試すだけです

  - (void)viewDidLoad
{
[super viewDidLoad];
CATransform3D transform = CATransform3DIdentity;
transform.m34 = -1 / 500.0;
transform = CATransform3DRotate(transform, .0 * M_PI_2, 1, 0, 0);/*Here the angle of transform set (Here angle set as 0)*/
self.transformView.layer.transform = transform;
}

 - (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];

CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
animation.fromValue = [NSNumber numberWithFloat:0];
animation.toValue = [NSNumber numberWithFloat:2 * M_PI];
animation.duration = 3.0;
animation.repeatCount = HUGE_VALF;
animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
[self.discView.layer addAnimation:animation forKey:@"transform.rotation.z"];
 }

 - (void)viewDidDisappear:(BOOL)animated {
[super viewDidDisappear:animated];
[self.discView.layer removeAllAnimations];
}    

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
 {
    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
  }

これで、 transformView を別のビューまたは ImageView に変更するだけです

于 2013-11-12T07:07:33.520 に答える
5

必要なことを達成するために必要なコードは、@Albin Joseph によって提供されたものよりも単純であることがわかりましたが、正しい方向に向けられました。アニメーションは中断したところから再開し、新しい位置に回転する必要があります。アニメ化される場合とされない場合があります。したがって、コードは次のとおりです。

CGFloat duration = animated ? 0.5 : 0.01;

CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
animation.fromValue = [[self.turnIndicatorImage.layer presentationLayer] valueForKeyPath:@"transform.rotation.z"];
animation.toValue = angle;
animation.duration = duration;
animation.fillMode = kCAFillModeForwards;
animation.repeatCount = 0;
animation.removedOnCompletion = NO;
animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
[self.turnIndicatorImage.layer addAnimation:animation forKey:@"transform.rotation.z"];
于 2014-05-20T15:38:35.350 に答える