如果没有您所看到的图片,很难确定发生了什么,但以下内容可能有用:
当您对视图应用旋转时,它会围绕 (0,0) 旋转它,因此您需要确保设置视图的边界,以便 (0,0) 是您想要的旋转中心。假设您正在旋转的图像是 100x200 图像,并且您想围绕图像的中心旋转,那么您需要说 self.bounds = CGMakeRect(-50, -100, 100, 200); 如果您不这样做,它将围绕它的左上角旋转螺旋。
哦,使用self.center 设置视图的位置似乎比在应用旋转时使用self.frame 更可预测。
这里有一些演示代码可能更容易理解。在这种情况下,执行动画的代码是视图控制器,但您应该明白:
#define USE_SELF_CENTER 0
- (void)viewDidLoad {
[super viewDidLoad];
self.rotation = 0.0f;
self.translation = CGPointMake(self.view.bounds.size.width/2.0f, 0.0);
ObjectView* ov = [[ObjectView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 100.0f, 100.0f)];
#if USE_SELF_CENTER==1
ov.center = self.translation;
#else
ov.transform = CGAffineTransformMakeTranslation(self.translation.x, self.translation.y);
#endif
// adjust bounds for center of rotation
ov.bounds = CGRectMake(-50.0f, -50.0f, 100.0f, 100.0f);
[self.view addSubview:ov];
self.objectView = ov;
[ov release];
NSTimer *aTimer = [NSTimer timerWithTimeInterval:0.5 target:self selector:@selector(nextFrame)
userInfo:nil repeats:YES];
self.timer = aTimer;
[aTimer release];
[[NSRunLoop mainRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];
}
- (void)nextFrame
{
NSLog(@"nextFrame");
self.rotation += (5.0 / 180.0f * M_PI);
self.translation = CGPointMake(self.translation.x, self.translation.y + 2.0);
#if USE_SELF_CENTER==1
CGAffineTransform t = CGAffineTransformMakeRotation(self.rotation);
self.objectView.center = self.translation;
self.objectView.transform = t;
#else
CGAffineTransform rot = CGAffineTransformMakeRotation(self.rotation);
CGAffineTransform txy = CGAffineTransformMakeTranslation(self.translation.x, self.translation.y);
CGAffineTransform t = CGAffineTransformConcat(rot, txy);
self.objectView.transform = t;
#endif
}
代码演示了两种方式来做你想做的事。如果USE_SELF_CENTER 为零,则所有动画都是通过变换完成的。如果USE_SELF_CENTER 不为零,则使用变换进行旋转,并通过设置视图的中心来完成平移。