#ios #uiviewanimation #uiviewanimationtransition
#iOS #uiviewanimation #переход uiviewanimation
Вопрос:
Я пытаюсь имитировать анимацию переворота, отображаемую в приложении iTunes для iPad. На главной странице, если вы нажмете на один из небольших постеров в списке новых релизов, он откроется, чтобы показать все детали фильма.
Когда постер нажат, я делаю это:
//...create newView
[self.view addSubview:poster]; //because the poster was previously in a scrollview
[UIView transitionWithView:self.view duration:3
options:UIViewAnimationOptionTransitionFlipFromLeft animations:^{
[poster removeFromSuperview];
[self.view addSubview:newView];
}
completion:NULL];
Но… переворачивается ВЕСЬ вид, а не только плакат. И он переворачивается вертикально, а не горизонтально, хотя я указал FlipFromLeft . Что я делаю не так?
РЕДАКТИРОВАТЬ: похоже, для этого вам нужно использовать какое-то представление контейнера. Итак, я сделал один, добавил к нему плакат, затем создал фиктивный UIView для тестирования:
CGPoint newPoint = [self.view convertPoint:CGPointMake(poster.frame.origin.x, poster.frame.origin.y) fromView:[poster superview]];
poster.frame = CGRectMake(0, 0, poster.frame.size.width, poster.frame.size.height);
UIView *containerView = [[UIView alloc] initWithFrame:CGRectMake(newPoint.x, newPoint.y, poster.frame.size.width, poster.frame.size.height)];
[self.view addSubview:containerView];
[containerView addSubview:poster];
UIView *testView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, containerView.frame.size.width, containerView.frame.size.height)];
testView.backgroundColor = [UIColor redColor];
[UIView transitionWithView:containerView duration:3
options:UIViewAnimationOptionTransitionFlipFromLeft animations:^{
[poster removeFromSuperview];
[containerView addSubview:testView];
}
completion:NULL];
Теперь вместо плаката появляется красный UIView, но анимации переворачивания вообще нет. Почему бы и нет?
Ответ №1:
Вы указываете вид для перехода self.view
, поэтому неудивительно, почему анимируется весь вид. Попробуйте вместо этого указать переход на анимацию с помощью представления плакатов.
[UIView transitionWithView:poster.view duration:3
options:UIViewAnimationOptionTransitionFlipFromLeft animations:^{
[poster removeFromSuperview];
[self.view addSubview:newView];
}
completion:NULL];
Ответ №2:
Я создал UIViewController (с именем: transitionView) с двумя UIImageView (с именами: fromImageView и toImageView). Я добавил transitionView в свой ViewController в viewDidLoad и установил альфа-значение 0. Я создаю оба из двух UIView изображение с помощью этого:
- (UIImage *) imageFromView: (UIView *) view {
CGFloat alpha = [view alpha];
[view setAlpha: 1.0];
CGSize pageSize = view.frame.size;
UIGraphicsBeginImageContext(pageSize);
CGContextRef resizedContext = UIGraphicsGetCurrentContext();
[view.layer renderInContext: resizedContext];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
[view setAlpha: alpha];
return image;
}
и вот мой код переворота с изменением размера:
- (void) flipFromView: (UIView *) fromView toView: (UIView *) toView {
// Warning: positions is wrong when your image (or view) is in UIScrollView...
CGRect frame = CGRectMake(-8.0, 30.0, 336.0, 380.0); // resizing the fromView if the image is small...
CGFloat interval = 1.0;
[[transitionView view] setAlpha: 1.0]; //
UIImage *fromViewImage = [self imageFromView: fromView];
UIImageView *fromImageView = [transitionView fromImageView];
[fromImageView setImage: fromViewImage];
[fromImageView setFrame: [fromView frame]];
UIImage *toViewImage = [self imageFromView: toView];
UIImageView *toImageView = [transitionView toImageView];
[toImageView setImage: toViewImage];
[toImageView setFrame: frame];
[fromView setHidden: YES]; // hide original while animating
toImageView.layer.transform = CATransform3DMakeRotation(M_PI_2, 0.0, 1.0, 0.0);
[UIView animateWithDuration: interval
delay: 0.0
options: UIViewAnimationOptionCurveEaseIn
animations: ^{
[fromImageView setFrame: frame];
fromImageView.layer.transform = CATransform3DMakeRotation(M_PI_2, 0.0, 1.0, 0.0);
} completion: ^(BOOL finished) {
}
];
[UIView animateWithDuration: interval
delay: interval // wait to previous animation ending
options: UIViewAnimationOptionCurveEaseOut
animations: ^{
toImageView.layer.transform = CATransform3DMakeRotation(M_PI_2, 0.0, 0.0, 0.0);
toImageView.frame = [toView frame];
} completion: ^(BOOL finished) {
[toView setAlpha: 1.0];
[fromView setHidden: NO];
}
];
}
И извините за мой плохой английский, я не говорю по-английски!