ちょうど写真の道のように
(新規ユーザーは画像の投稿を許可されていません。申し訳ありませんが、リンクを提供することしかできません)
http://cdn.dropmark.com/30180/3bd0f0fc6ee77c1b6f0e05e3ea14c821f8b48a82/questiong1-1.jpg
助けてくれてありがとう
ちょうど写真の道のように
(新規ユーザーは画像の投稿を許可されていません。申し訳ありませんが、リンクを提供することしかできません)
http://cdn.dropmark.com/30180/3bd0f0fc6ee77c1b6f0e05e3ea14c821f8b48a82/questiong1-1.jpg
助けてくれてありがとう
touchsイベントデリゲートでこれを試してください(touchイベントでビューを回転させたい場合)-
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
touches = [event allTouches];
UITouch *touch = [[event allTouches] anyObject];
CGPoint Pageposition = [touch locationInView:self];
CGPoint prevPoint = [[[touches allObjects] objectAtIndex:0] previousLocationInView:self];
CGPoint curPoint = [[[touches allObjects] objectAtIndex:0] locationInView:self];
float prevAngle = atan2(prevPoint.x, prevPoint.y);
float curAngle= atan2(curPoint.x, curPoint.y);
float angleDifference = curAngle - prevAngle;
CGAffineTransform newTransform3 = CGAffineTransformRotate(self.transform, angleDifference);
self.transform = newTransform3;
}
変換回転を使用して、機能するかどうかを教えてください。
回転時にアンカーポイントを使用することに関する詳細な説明については、「任意のポイントを中心にラベルを回転させる」に関するこの質問に対する私の回答を参照してください(キーフレームアニメーションの回答はより複雑であり、「このための適切なツールではないため、無視してください」)。たとえ答えがそう言っているとしても)。
要するに、アンカーポイントを(ビューレイヤーの単位座標系の)ビューの外側のポイントに設定し、通常の回転アニメーションを適用するだけです。
レイヤーのフレーム (ビューのフレームでもあります) は、位置、境界、およびアンカー ポイントを使用して計算されます。anchorPoint を変更すると、ビューが画面に表示される場所が変わります。アンカーポイントを変更した後にフレームを再設定することで、これに対抗できます(これにより、位置が設定されます)。それ以外の場合は、自分自身に対して回転しているポイントに位置を設定できます。Layer Geometry and Transforms (他の質問にリンクされています) もこれについて言及しています。
その回答で提供したコード (UIView-animations の代わりに UIView と Core Animation に一般化されています):
#define DEGREES_TO_RADIANS(angle) (angle/180.0*M_PI)
- (void)rotateView:(UIView *)view
aroundPoint:(CGPoint)rotationPoint
duration:(NSTimeInterval)duration
degrees:(CGFloat)degrees {
CABasicAnimation *rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform"];
[rotationAnimation setDuration:duration];
// Additional animation configurations here...
// The anchor point is expressed in the unit coordinate
// system ((0,0) to (1,1)) of the label. Therefore the
// x and y difference must be divided by the width and
// height of the view (divide x difference by width and
// y difference by height).
CGPoint anchorPoint = CGPointMake((rotationPoint.x - CGRectGetMinX(view.frame))/CGRectGetWidth(view.bounds),
(rotationPoint.y - CGRectGetMinY(view.frame))/CGRectGetHeight(view.bounds));
[[view layer] setAnchorPoint:anchorPoint];
[[view layer] setPosition:rotationPoint]; // change the position here to keep the frame
CATransform3D rotationTransform = CATransform3DMakeRotation(DEGREES_TO_RADIANS(degrees), 0, 0, 1);
[rotationAnimation setToValue:[NSValue valueWithCATransform3D:rotationTransform]];
// Add the animation to the views layer
[[view layer] addAnimation:rotationAnimation
forKey:@"rotateAroundAnchorPoint"]
}