Поворот UIView по оси X (горизонтальная ось)



Я хотел повернуть 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 градусов. Я хочу, чтобы он перевернулся еще раз, чтобы я мог нормально видеть вид..



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



Спасибо

703   5  

5 ответов:

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

self.tableView.layer.transform = CATransform3DConcat(self.tableView.layer.transform, CATransform3DMakeRotation(M_PI,1.0,0.0,0.0));

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

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

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

  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];

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

 [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");

            }];           

        }];

Вы также можете подойти к этому с помощью опций .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
    }

Comments

    Ничего не найдено.