UIView: вращение + движение - PullRequest
1 голос
/ 12 мая 2011

Я пытаюсь переместить и повернуть UIImageView. Я не использую Core Animation для этого, и я не могу использовать его.

Кстати, основная часть анимации такова:

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;

Это почти работает. Я двигаюсь или вращается на месте , но когда я пытаюсь повернуть и вращать его, он полностью искажает перекос.

Я пытался двигаться, а затем вращаться и наоборот. Я также попробовал различные значения для режима контента без удачи Любая помощь?

EDIT

полезное руководство: http://www.permadi.com/blog/2009/05/iphone-sdk-bouncing-and-rotating-ball-example/

Ответы [ 4 ]

2 голосов
/ 12 мая 2011

Трудно быть уверенным в том, что происходит, без изображения того, что вы видите, но может пригодиться следующее:

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

1 голос
/ 12 мая 2011

используйте что-то вроде этого, идея состоит в том, чтобы объединить оба преобразования, т.е.

CGAffineTransform transforms = CGAffineTransformConcat(CGAffineTransformMakeTranslation(-1, -(self.gravity + spring)),CGAffineTransformMakeRotation(rotation));
self.transform = transforms;


Надеюсь, это сработает

0 голосов
/ 21 августа 2013

Следующий код помог мне в достижении перевода (вертикального движения) и вращения вместе.

CGAffineTransform transform = CGAffineTransformMakeTranslation(0, -200); transform = CGAffineTransformRotate(transform, M_PI);</p> <pre><code>[UIView transitionWithView:self duration:0.5 options:UIViewAnimationOptionAllowAnimatedContent<br> animations:^{ [view setTransform:transform]; } completion:^(BOOL finished){ }];

Надеюсь, это поможет кому-то еще ...

0 голосов
/ 12 мая 2011

Здравствуйте, пожалуйста, используйте эти шаги.На вашей XIB возьмите UIImageView и установите Image и установите его 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;
 }

Этот код поможет только для поворота изображения ....

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...