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