Поведение перехода с использованием transitionFromView и transitionWithView - PullRequest
21 голосов
/ 30 августа 2010

Я пытаюсь создать переход между двумя подпредставлениями (view1 и view2). Когда кнопка нажата, я хочу, чтобы view1 (спереди) перевернулся и показал view2 (сзади). Я пробовал и transitionFromView и transitionWithView. Каждый работает - но у каждого есть проблема.

transitionFromView - переворачивает суперпредставление (переворачивается весь вид окна, а не подпредставления). Когда происходит этот переворот - одно подпредставление находится в передней части суперпредставления перед переворотом, а другое подпредставление находится в задней части переворота - как и должно быть. Но я не хочу, чтобы супервидение перевернулось, только подпредставления.

transitionWithView - переворачивает только подпредставления - но представление «до» отображается до перехода.

У кого-нибудь есть предложение?

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

Ответы [ 7 ]

26 голосов
/ 28 декабря 2010

Вам необходимо удалить и добавить подпредставления в блоке анимации.Кроме того, я думаю, что transitionWithView должен принимать супер представление в качестве аргумента.Я думаю, что вам нужно сделать, чтобы получить это право, это использовать контейнерное представление того же размера, что и представления, которые вы хотите перевернуть.

Это скопировано из документации:

[UIView transitionWithView:containerView
       duration:0.2
       options:UIViewAnimationOptionTransitionFlipFromLeft
       animations:^{ [fromView removeFromSuperview]; [containerView addSubview:toView]; }
       completion:NULL];
13 голосов
/ 03 марта 2011

Я столкнулся с точно такой же проблемой, и я согласен с более ранним ответом. Кажется, у вас должен быть контейнерный вид для анимации перехода от одного подпредставления к другому подпредставлению.

Я использую подход transitionFromView. Чтобы иметь фон позади анимации, вам также понадобится суперпредставление с фоном для представления контейнера.

Мой код выглядит так:

    [UIView transitionFromView:view1
                        toView:view2
                      duration:0.5
                       options:UIViewAnimationOptionTransitionFlipFromRight |
                               UIViewAnimationOptionAllowUserInteraction    |
                               UIViewAnimationOptionBeginFromCurrentState
                    completion:nil];
7 голосов
/ 27 января 2012

Вот моя заглушка рабочего решения, простая вещь, которая заняла 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;
     }];
}
5 голосов
/ 08 сентября 2011

Столкнувшись с той же проблемой, я согласен с Эриком и Сэмом: оба transitionWithView или transitionFromView будут делать то, что вы хотите, как указано выше, до тех пор, пока вы создаете представление контейнера соответствующего размера, который вы хотите перевернуть. В противном случае весь вид окна перевернется.

Итак, если view1 - это подпредставление, с которого вы начали, и вы хотите перейти к view2, тогда добавьте

UIView *containerView = [[UIView alloc] initWithFrame:appropriateSize];
[containerView addSubview:view1];

И тогда, возможно, самый простой способ оживить:

[UIView transitionFromView:view1 
                    toView:view2 
                  duration:2.0   
                   options:UIViewAnimationOptionTransitionFlipFromLeft   
                completion:nil];   
1 голос
/ 04 сентября 2011

У меня было такое же требование, и я видел много подходов - от использования слоев (что очень сложно, если вы просто хотите иметь дело с 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];    

Я экспериментировал с различными параметрами "duration" - впоследствии сделал его плавающим, который я установил в подпрограмме viewDidLoad. Быстрее 0,3 почти не виднои значение 1 или 2 очень медленное ...

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

0 голосов
/ 05 августа 2015

при использовании transitionFromView оба вида спереди и сзади должны быть внутри другого вида (не суперпредставления). таким образом, он не перевернет весь экран.

> superview
>     another view
>        backview
>        frontview

UIView.transitionFromView (frontView, toView: backView, продолжительность: 0,5, параметры: .TransitionFlipFromLeft | .ShowHideTransitionViews) {завершено в

}

Возможно, вы захотите сделать (другой вид) равным размеру frontView

0 голосов
/ 21 мая 2012

Имейте в виду, что для представления контейнера требуется сплошной фоновый цвет. Это означает что-то еще, кроме прозрачного цвета. Это была моя ошибка, и я потратил довольно много времени, чтобы выяснить это.

...