#iphone #uiview
#iPhone #пользовательский просмотр
Вопрос:
Я пытаюсь перемещать и поворачивать UIImageView. Я не использую основную анимацию для этого и не могу ее использовать.
Кстати, основная часть анимации заключается в следующем:
CGRect r = self.frame;
r.origin.y -= self.gravity spring;
r.origin.x -= 1;
self.rotation -= 0.015;
self.transform = CGAffineTransformMakeRotation(rotation);
self.frame = r;
Это почти работает. Я перемещаюсь или он действительно вращается на месте, но когда я пытаюсь переместить и повернуть его, он полностью деформирует перекос.
Я пытался перемещать, а затем поворачивать и наоборот. Я также пробовал различные значения для режима содержимого, но безуспешно. Любая помощь?
Редактировать
полезный урок:http://www.permadi.com/blog/2009/05/iphone-sdk-bouncing-and-rotating-ball-example
Комментарии:
1. вы хотите одновременно и движение, и вращение??? или по отдельности?
2. в одно и то же время. перемещение обновляется каждый тик в методе, вызываемом NSTimer
3. Почему вы не можете использовать основную анимацию? Это упрощает задачу.
4. мне нужно анимировать изображение в соответствии с физической моделью. в моем случае работать с векторами силы, гравитации и т.п. Для вычисления x и y на каждом такте намного проще, чем генерировать кривые Безье и временные рамки, соответствующие модели.
Ответ №1:
Трудно быть уверенным в том, что происходит, без изображения того, что вы видите, но следующее может быть полезным:
Когда вы применяете поворот к виду, он поворачивает его вокруг (0,0), поэтому вам нужно убедиться, что вы установили границы своего вида так, чтобы (0,0) было там, где вы хотите, чтобы центр вращения. Предположим, что изображение, которое вы вращаете, представляет собой изображение размером 100×200, и вы хотите повернуть вокруг центра изображения, тогда вам нужно будет сказать, 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
не равно нулю, для поворота используется преобразование, и перевод выполняется путем установки центра представления.
Ответ №2:
используйте что-то вроде этого, идея состоит в том, чтобы объединить оба преобразования, т.Е.
CGAffineTransform transforms = CGAffineTransformConcat(CGAffineTransformMakeTranslation(-1, -(self.gravity spring)),CGAffineTransformMakeRotation(rotation));
self.transform = transforms;
Надеюсь, это сработает
Комментарии:
1. спасибо за подсказку, но, к сожалению, это не работает : ( я получаю тот же результат
Ответ №3:
Привет, друг, пожалуйста, воспользуйся этими шагами. На вашем XIB возьмите UIImageView и установите изображение и установите его IBOutlet.
В файле .h
int theta;
NSTimer *tmrAnimation;
IBOutlet UIImageView *imgViewLoader;
В файле .m
- (void)viewDidLoad
{
[super viewDidLoad];
theta = 0;
tmrAnimation = [NSTimer scheduledTimerWithTimeInterval:0.01 target:self selector:@selector(animationImageViewLoader) userInfo:nil repeats:YES];
}
Добавьте эту функцию в свой файл .m.
-(void)animationImageViewLoader
{
CGFloat angle = theta * (PI / 100);
CGAffineTransform transform = CGAffineTransformMakeRotation(angle);
theta = (theta 1) % 200;
imgViewLoader.transform = transform;
}
Этот код поможет только для поворота изображения….
Комментарии:
1. привет, спасибо за код, но это то, что я уже делаю. вращение уже работает, моя проблема в том, что оно работает вместе с анимацией.
Ответ №4:
Следующий код помог мне добиться перевода (вертикального перемещения) и поворота одновременно.
CGAffineTransform transform = CGAffineTransformMakeTranslation(0, -200);
transform = CGAffineTransformRotate(transform, M_PI);
[UIView transitionWithView:self
duration:0.5
options:UIViewAnimationOptionAllowAnimatedContent<br>
animations:^{
[view setTransform:transform];
}
completion:^(BOOL finished){
}];
Надеюсь, это поможет кому-то еще...