Iphone 使用transitionFromView和transitionWithView的转换行为

Iphone 使用transitionFromView和transitionWithView的转换行为,iphone,uiview,views,ios,transitions,Iphone,Uiview,Views,Ios,Transitions,我正在尝试在两个子视图(视图1和视图2)之间创建转换。按下按钮时,我希望view1(前)翻转并显示view2(后)。我尝试了从视图转换和从视图转换。每种方法都有效,但都有问题 transitionFromView-翻转超级视图(翻转整个窗口视图,而不是子视图)。当发生此翻转时-一个子视图位于翻转前的superview的前面,另一个子视图位于翻转的后面-应该如此。但我不希望超级视图翻转,只希望子视图翻转 transitionWithView-仅翻转子视图-但在转换发生之前会显示“到”视图 有人有什

我正在尝试在两个子视图(视图1和视图2)之间创建转换。按下按钮时,我希望view1(前)翻转并显示view2(后)。我尝试了从视图转换和从视图转换。每种方法都有效,但都有问题

transitionFromView-翻转超级视图(翻转整个窗口视图,而不是子视图)。当发生此翻转时-一个子视图位于翻转前的superview的前面,另一个子视图位于翻转的后面-应该如此。但我不希望超级视图翻转,只希望子视图翻转

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

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

这是从文档中复制的:

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

我遇到了完全相同的问题,我同意前面的答案。似乎必须有一个容器视图来设置从一个子视图到另一个子视图的过渡动画

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

我的代码如下所示:

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

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

(注意:我在一个网格(游戏)中有一个UIView数组(tiles[x][y])。我的所有ImageFileName都在数据库表/数组中,这些表/数组动态加载到UIImageView的UIImages中。在名为“tileBackPicImageNM”的UIImage中,卡的“背面”或tile的图像

因此,我的代码只是将正面图像换成了背面图像:

[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非常慢


这不涉及两个子视图,这在我的情况下是非常有用的,因为我不想有一个包含视图层次结构的容器数组,等等。在新的级别上,等等,我总是重新加载数组…

遇到同样的问题,我同意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];   

这是我的工作解决方案存根,一件花了2个小时的简单事情,该死: 我们有一个按钮来翻转东西,一个名为panel的
UIView
,其中包含我想用翻转动画交换的两个视图

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

请记住,容器视图需要纯色背景。它意味着除清晰颜色以外的任何颜色。这是我的错误,我花了很长时间来解决它。

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

> superview
>     another view
>        backview
>        frontview
UIView.transitionFromView(frontView,toView:backView,持续时间:0.5,选项:.TransitionFlipFromLeft |.ShowHideTransitionViews){在中完成

}


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

请在下面标记一个问题作为答案,或者输入您自己的答案来解决您的问题以帮助社区。他为什么要将一个问题标记为答案?:d容器视图是关键。这在ios6和ios7上经过测试和使用