Трудно быть уверенным в том, что происходит, без изображения того, что вы видите, но может пригодиться следующее:
Когда вы применяете вращение к виду, оно вращается вокруг (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
не равен нулю, для поворота используется преобразование, а перевод выполняется путем установки центра вида.