Переходное поведение с использованием transitionFromView и transitionWithView
Я пытаюсь создать переход между двумя subviews (view1 и view2). Когда нажимается кнопка, я хочу, чтобы view1 (front) перевернулся и отобразил view2 (назад). Я попробовал оба переходаFromView и transitionWithView. Каждый работает, но каждый из них имеет проблему.
переходFromView - переворачивает супервизор (весь просмотр окна переворачивается, а не подпункты). Когда этот флип происходит - одно подобие находится на передней панели надзора перед флип, а другое подвью - на обратной стороне флип - как и должно быть. Но я не хочу, чтобы супервизор перевернулся, только подсмотры.
transitionWithView - переворачивает только подпункты, но перед переходом отображается представление 'to'.
У кого-нибудь есть предложение?
-(IBAction) button1action:(id) sender {
if ([sender tag] == 0) {
[UIView transitionFromView:view2 toView:view1 duration:2.0
options:UIViewAnimationOptionTransitionFlipFromLeft
completion:nil];
}
else {
[view1 removeFromSuperview];
[self.view addSubview:view2];
[UIView transitionWithView:view2
duration:2.0
options:UIViewAnimationOptionTransitionFlipFromRight +
UIViewAnimationOptionShowHideTransitionViews
animations:^{}
completion:nil];
}
}
Ответы
Ответ 1
Вам нужно удалить и добавить subviews в блок анимации. Кроме того, я думаю, что переходWithView должен воспринимать супер-представление как аргумент. Я думаю, что вам нужно сделать это, чтобы использовать это представление контейнера такого же размера, как и те, которые вы хотите перевернуть.
Это скопировано из документации:
[UIView transitionWithView:containerView
duration:0.2
options:UIViewAnimationOptionTransitionFlipFromLeft
animations:^{ [fromView removeFromSuperview]; [containerView addSubview:toView]; }
completion:NULL];
Ответ 2
Я столкнулся с этой же проблемой, и я согласен с более ранним ответом. Кажется, у вас должен быть вид контейнера для анимации перехода от одного подвэка к другому подвью.
Я использую подход transitionFromView. Чтобы иметь задний план анимации, вам также понадобится супервизор с фоном для представления контейнера.
Мой код выглядит так:
[UIView transitionFromView:view1
toView:view2
duration:0.5
options:UIViewAnimationOptionTransitionFlipFromRight |
UIViewAnimationOptionAllowUserInteraction |
UIViewAnimationOptionBeginFromCurrentState
completion:nil];
Ответ 3
Вот мой рабочий раствор, простая вещь, которая заняла 2 часа, черт:
у нас есть 1 кнопка, чтобы перевернуть вещи, панель UIView
, которая содержит 2 вида, которые я хочу поменять с помощью флип-анимации.
-(void)viewDidLoad{
[super viewDidLoad];
UIButton *btnFlip = [UIButton buttonWithType:UIButtonTypeRoundedRect];
btnFlip.frame = CGRectMake(10, 10, 50, 30);
[btnFlip setTitle:@"flip" forState:UIControlStateNormal];
[btnFlip addTarget:self action:@selector(flip) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:btnFlip];
panel = [[UIView alloc] initWithFrame:CGRectMake(10, 40, 300,300)];
panel.backgroundColor = [UIColor darkGrayColor];
[self.view addSubview:panel];
panelBack = [[UIView alloc] initWithFrame:CGRectMake(10, 40, 280, 200)];
panelBack.tag = 1;
panelBack.backgroundColor = [UIColor brownColor];
[panel addSubview:panelBack];
panelFront = [[UIView alloc] initWithFrame:CGRectMake(10, 40, 280, 200)];
panelFront.tag = 2;
panelFront.backgroundColor = [UIColor whiteColor];
[panel addSubview:panelFront];
displayingFront = TRUE;
}
-(void)flip{
[UIView transitionWithView:panel
duration:0.5
options:(displayingFront ? UIViewAnimationOptionTransitionFlipFromRight : UIViewAnimationOptionTransitionFlipFromLeft)
animations:^{
if (displayingFront) {
//panelFront.hidden=TRUE;
//panelBack.hidden = FALSE;
[panelFront removeFromSuperview];
[panel addSubview:panelBack];
}else{
//panelFront.hidden=FALSE;
//panelBack.hidden = TRUE;
[panelBack removeFromSuperview];
[panel addSubview:panelFront];
}
}
completion:^(BOOL finished){
displayingFront = !displayingFront;
}];
}
Ответ 4
Вступая в ту же проблему, я согласен с Эриком и Сэмом:
либо transitionWithView или transitionFromView будут делать то, что вы хотите, как указано выше, пока вы создаете представление контейнера соответствующего размера, который вы хотите перевернуть. В противном случае будет отображаться весь вид окна.
Итак, если view1 - это subview, с которого вы начинаете, и вы хотите перевернуть на view2, добавьте
UIView *containerView = [[UIView alloc] initWithFrame:appropriateSize];
[containerView addSubview:view1];
И, возможно, самый простой способ анимации:
[UIView transitionFromView:view1
toView:view2
duration:2.0
options:UIViewAnimationOptionTransitionFlipFromLeft
completion:nil];
Ответ 5
У меня было такое же требование, и я видел много подходов - от использования слоев (что очень сложно, если вы просто хотите иметь дело с UIView), к предложениям о том, что мне нужен "контейнер", чтобы затем перейти между суб- Просмотры. Но если вы просто хотите перевернуть что-то вперед-назад, например, перевернув игровую карту или игровую плитку, я сделал однострочное изменение:
(примечание: у меня есть массив UIViews (плитки [x] [y]) в сетке (для игры). У меня есть все мои изображения в таблицах/массивах базы данных, которые динамически загружаются в UIImages UIImageViews. Изображение для "обратной" карты или плитки в UIImage под названием "tileBackPicImageNM".
поэтому мой код, который просто заменил изображение переднего изображения для изображения задней части, был:
[tiles[indexX][indexY] setImage:[UIImage imageNamed:tileBackPicImageNM]];
который отлично работает.
но и теперь, чтобы показать действие сбрасывания, это:
[UIView transitionWithView:tiles[indexX][indexY] duration:0.3 options:UIViewAnimationOptionTransitionFlipFromLeft
animations:^{
[[indexX][indexY] setImage:[UIImage imageNamed:tileBackPicImageNM]];
}
completion:NULL];
Я экспериментировал с разными параметрами "длительности" - впоследствии сделал это float, который я установил в подпрограмме viewDidLoad. Быстрее 0,3 почти не видно, а значение 1 или 2 очень медленно...
Это не связано с двумя под-представлениями, это мой случай намного полезнее, поскольку я не хотел иметь массив контейнеров, содержащий иерархию представлений и т.д., и на новых уровнях и т.д. я всегда перезагрузите массивы в любом случае...
Ответ 6
Имейте в виду, что для представления контейнера требуется сплошной цвет фона. Это означает что-то еще, чем чистый цвет. Это была моя ошибка и потратил довольно долгое время, чтобы понять это.
Ответ 7
с помощью переходаFromView, передним и задним видом должно быть внутри другого представления (а не супер-представление). таким образом, он не будет переворачивать весь экран.
> superview
> another view
> backview
> frontview
UIView.transitionFromView(frontView, toView: backView, продолжительность: 0.5, опции:.TransitionFlipFromLeft |.ShowHideTransitionViews) {завершено в
}
Возможно, вы захотите сделать (другое представление) равным размеру frontView