Подтвердить что ты не робот

Переходное поведение с использованием 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];  
 }
}
4b9b3361

Ответ 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