转换行为使用transitionFromView和transitionWithView

我正在尝试创build两个子视图(view1和view2)之间的转换。 当按下button时,我希望view1(前)翻转并显示view2(后退)。 我已经尝试了transitionFromView和transitionWithView。 每个工程 – 但每个都有问题。

transitionFromView – 翻转超视图(整个窗口视图翻转,而不是子视图)。 当这个翻转发生时 – 一个子视图在翻转之前在超视图的前面,而另一个子视图在翻转的后面 – 就像它应该是的。 但是我不希望superview翻转,只是子视图。

transitionWithView – 仅翻转子视图 – 但在转换发生之前显示“to”视图。

任何人有一个build议?

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

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

这是从文档复制:

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

我遇到了这个完全相同的问题,我同意以前的答案。 看起来你必须有一个容器视图来animation从一个子视图到另一个子视图的转换。

我正在使用transitionFromView方法。 要在animation背后创build背景,还需要使用超级视图来显示容器视图的背景。

我的代码如下所示:

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

这里是我的工作解决scheme存根,一个简单的事情,花了2个小时,该死的:我们有一个button来翻转的东西,一个UIView调用面板,拥有2个视图,我想交换与翻转animation。

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

遇到同样的问题,我同意埃里克和山姆:或者transitionWithView或transitionFromView都将做你想要的,如上所述,只要你创build一个合适的大小,你想翻转的容器视图。 否则整个窗口视图将翻转。

所以,如果view1是你开始的子视图,你想翻转view2然后添加

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

然后,最简单的animation方式可能是:

 [UIView transitionFromView:view1 toView:view2 duration:2.0 options:UIViewAnimationOptionTransitionFlipFromLeft completion:nil]; 

我有同样的要求,并看到了许多方法 – 从使用图层(如果你只是想处理一个UIView结果非常复杂)build议,我需要一个“容器”,然后过渡到子视图。 但是如果你只是想从头到尾交换一些东西,比如翻过一张纸牌或一个游戏图块,我就做了一个改变:

(注意:我在网格中有一个UIViews(tiles [x] [y])数组,我将所有图像文件名存储在数据库表/数组中,这些数据库dynamic地被加载到UIImageViews的UIImage中。图像名称为“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的值非常慢

这不涉及两个子视图,这是我的情况是更有用的,因为我不想有一个容器数组包含视图的层次结构等…和新的水平等我总是重新加载数组无论如何…

请记住,容器视图需要一个坚实的背景颜色。它意味着除了清晰的颜色以外的任何东西。这是我的错误,花了相当长的时间来弄清楚。

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

 > superview > another view > backview > frontview 

UIView.transitionFromView(frontView,toView:backView,持续时间:0.5,选项:.TransitionFlipFromLeft | .ShowHideTransitionViews){完成

}

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