Повернуть UIView вокруг своей оси X (горизонтальная ось) - PullRequest
7 голосов
/ 07 октября 2011

Я хотел повернуть UIView на горизонтальную ось на 360 градусов, а затем обновить содержимое в представлении.Я искал решения по этому вопросу.Нашел пару здесь и там.Это то, что я получил.

    [UIView animateWithDuration:1 delay:0 options:UIViewAnimationOptionTransitionNone animations:^{
        self.tableView.layer.transform = CATransform3DMakeRotation(M_PI,1.0,0.0,0.0);
    } completion:^(BOOL finished){
        NSLog(@"Finished first pi");
        [UIView animateWithDuration:1 delay:0 options:UIViewAnimationOptionTransitionNone animations:^{
            self.tableView.layer.transform = CATransform3DMakeRotation(M_PI,1.0,0.0,0.0);
        }  completion:^(BOOL finished) {
            NSLog(@"Finished second pi");

        }];           

    }];

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

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

Спасибо

Ответы [ 5 ]

9 голосов
/ 08 октября 2011

В вашем блоке завершения попробуйте объединить новое преобразование с текущим преобразованием.

self.tableView.layer.transform = CATransform3DConcat(self.tableView.layer.transform, CATransform3DMakeRotation(M_PI,1.0,0.0,0.0));
2 голосов
/ 08 октября 2011

Вы должны проверить этот ответ Как заставить CATransform3dMakeRotation вращаться другим способом?И связать вместе

Я думаю, что ваша проблема связана с: «Когда вы работаете с преобразованием напрямую, Core Animation будет интерполировать преобразование из текущего значения в указанное преобразование. Оно найдеткратчайший путь к этому преобразованию, что ограничит направление анимации. Если вы попытаетесь анимировать одно и то же свойство преобразования дважды, второе значение просто переопределит первое, а не объединит два преобразования вместе. "

1 голос
/ 13 сентября 2013

используйте это: -

  rotatingView.layer.anchorPoint = CGPointMake(0.0f, 0.0f);
    rotatingView.center = CGPointMake(0,
                                       (rotatingView.center.y -
                                        (rotatingView.bounds.size.height/2.0f)));
    rotatingView.center = CGPointMake(0,
                                      (rotatingView.center.y-
                                       (rotatingView.bounds.size.height/2)));

// start the Page Open
[UIView beginAnimations:@"Animation" context:nil];
[UIView setAnimationDuration:13.0];
// set angle as per requirement
[rotatingView.layer setValue:[NSNumber numberWithInt:280]
                   forKeyPath:@"transform.rotation.x"];

[UIView commitAnimations];
0 голосов
/ 17 марта 2017

Вы также можете подойти к этому, используя опции анимации .Repeat и .Autoreverse + настройку количества повторений анимации.Вот пример в Swift:

    UIView.animateWithDuration(time, delay: 0, options: [.Repeat, .Autoreverse], animations: {
        UIView.setAnimationRepeatCount(3)
        self.view.layer.transform = CATransform3DMakeRotation(CGFloat(M_PI), 1, 0, 0)
    }) { (completed) in
        // completion
    }
0 голосов
/ 04 августа 2015

Вам просто нужно изменить свой код с 1.0 на 0.0 внутри блока завершения, и woohoo все готово.

 [UIView animateWithDuration:1 delay:0 options:UIViewAnimationOptionTransitionNone animations:^{
            self.tableView.layer.transform = CATransform3DMakeRotation(M_PI,1.0,0.0,0.0);
        } completion:^(BOOL finished){
            NSLog(@"Finished first pi");
            [UIView animateWithDuration:1 delay:0 options:UIViewAnimationOptionTransitionNone animations:^{
                self.tableView.layer.transform = CATransform3DMakeRotation(M_PI,0.0,0.0,0.0);
            }  completion:^(BOOL finished) {
                NSLog(@"Finished second pi");

            }];           

        }];
...