21

我正在尝试在两个子视图(view1 和 view2)之间创建过渡。当按下按钮时,我希望 view1(前)翻转并显示 view2(后)。我已经尝试过transitionFromView 和transitionWithView。每个都有效-但每个都有问题。

transitionFromView - 翻转超级视图(整个窗口视图翻转,而不是子视图)。当这种翻转发生时——一个子视图在翻转之前位于父视图的前面,而另一个子视图在翻转的后面——应该是这样。但我不希望超级视图翻转,只是子视图。

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

7 回答 7

26

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

这是从文档中复制的:

[UIView transitionWithView:containerView
       duration:0.2
       options:UIViewAnimationOptionTransitionFlipFromLeft
       animations:^{ [fromView removeFromSuperview]; [containerView addSubview:toView]; }
       completion:NULL];
于 2010-12-28T00:58:24.153 回答
13

我遇到了同样的问题,我同意前面的答案。看来您必须有一个容器视图来动画从一个子视图到另一个子视图的过渡。

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

我的代码如下所示:

    [UIView transitionFromView:view1
                        toView:view2
                      duration:0.5
                       options:UIViewAnimationOptionTransitionFlipFromRight |
                               UIViewAnimationOptionAllowUserInteraction    |
                               UIViewAnimationOptionBeginFromCurrentState
                    completion:nil];
于 2011-03-03T16:35:03.857 回答
7

这是我的工作解决方案存根,一个简单的事情,花了 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;
     }];
}
于 2012-01-27T02:09:27.683 回答
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];   
于 2011-09-08T18:31:31.640 回答
1

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

(注意:我在网格中有一组 UIViews(tiles[x][y])(用于游戏)。我在数据库表/数组中有我所有的图像文件名,它们动态加载到 UIImageViews 的 UIImages 中。名为“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 的值很慢……

这不涉及两个子视图,这在我的情况下更有用,因为我不希望有一个包含视图层次结构的容器数组等......并且在新级别等上我总是重新加载数组反正...

于 2011-09-04T00:50:31.947 回答
0

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

于 2012-05-21T13:45:00.240 回答
0

使用transitionFromView,前视图和后视图都应该在另一个视图中(不是超级视图)。这样它就不会翻转整个屏幕。

> superview
>     another view
>        backview
>        frontview

UIView.transitionFromView(frontView, toView: backView, duration: 0.5, options: .TransitionFlipFromLeft | .ShowHideTransitionViews) { 完成于

}

您可能想让(另一个视图)等于 frontView 的大小

于 2015-08-04T22:27:55.073 回答