使用transitionFromView和transitionWithView的过渡行为

时间:2010-08-30 16:47:18

标签: iphone uiview views ios transitions

我正在尝试在两个子视图(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 个答案:

答案 0 :(得分:26)

您需要在动画块中删除并添加子视图。另外,我认为transitionWithView应该将超级视图作为参数。我认为你需要做的就是使用一个与想要翻转的视图大小相同的容器视图。

这是从文档中复制的:

[UIView transitionWithView:containerView
       duration:0.2
       options:UIViewAnimationOptionTransitionFlipFromLeft
       animations:^{ [fromView removeFromSuperview]; [containerView addSubview:toView]; }
       completion:NULL];

答案 1 :(得分:13)

我遇到了同样的问题,我同意之前的回答。看来你必须有一个容器视图,用于动画从一个子视图到另一个子视图的转换。

我正在使用transitionFromView方法。要在动画后面有背景,您还需要一个具有容器视图背景的超级视图。

我的代码如下:

    [UIView transitionFromView:view1
                        toView:view2
                      duration:0.5
                       options:UIViewAnimationOptionTransitionFlipFromRight |
                               UIViewAnimationOptionAllowUserInteraction    |
                               UIViewAnimationOptionBeginFromCurrentState
                    completion:nil];

答案 2 :(得分:7)

这是我的工作解决方案存根,一个花了2个小时的简单事情,该死的: 我们有一个按钮来翻转东西,一个叫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;
     }];
}

答案 3 :(得分:5)

遇到同样的问题我同意Eric和Sam: 只要您创建了一个您希望翻转的适当大小的容器视图,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];   

答案 4 :(得分:1)

我有相同的要求,并且看到了许多方法 - 从使用图层(如果你只是想处理UIView,这最终会非常复杂)到我需要一个“容器”然后在它之间转换的建议观点。但是如果你只是想要从前到后翻转某些东西,比如翻过扑克牌或游戏牌,我就换了一行:

(注意:我在网格中有一个UIViews数组(tiles [x] [y])(用于游戏)。我拥有数据库表/数组中的所有图像文件名,动态加载到UIImages中UIImageViews。名为“tileBackPicImageNM”的UIImage中卡片或磁贴“后面”的图像。

所以我的代码只是简单地将正面图像换成后面的图像:

[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];    

我尝试了不同的“持续时间”参数 - 随后使它成为我在viewDidLoad例程中设置的浮点数。几乎看不到快于0.3的值,1或2的值非常慢......

这不涉及两个子视图,这是我的情况更有用,因为我不想拥有包含视图层次结构等的容器数组......并且在新的关卡等我总是无论如何重新加载阵列......

答案 5 :(得分:0)

请记住,容器视图需要坚实的背景颜色。这意味着除了清晰的颜色之外的其他任何东西。这是我的错误,花了很长时间才弄明白。

答案 6 :(得分:0)

使用transitionFromView,前视图和后视图都应位于另一个视图内(而不是超视图)。这样它就不会翻转整个屏幕。

> superview
>     another view
>        backview
>        frontview

UIView.transitionFromView(frontView,toView:backView,duration:0.5,options:.TransitionFlipFromLeft | .ShowHideTransitionViews){finished in

}

您可能希望使(另一个视图)等于frontView的大小