2012-03-01 53 views
21

这是一个iPad项目,我有一个UIView与几个子视图,我想使用[UIView transitionFromView:toView:duration:options :完成],但是当我运行这个方法时,整个父视图被翻转了! 这是我使用的代码:如何翻转单个UIView(不翻转父视图)

UIView *secondView = [[UIView alloc] initWithFrame:CGRectMake(200, 200, 300, 300)]; 
[newView setBackgroundColor:[UIColor redColor]]; 
    [UIView transitionFromView:self.firstView.view toView:secondView duration:1.0 options:UIViewAnimationOptionTransitionFlipFromLeft completion:nil]; 

我如何能对此的看法之间没有翻转动画整个父视图任何想法? 谢谢!

回答

70

此代码可以帮助你:

把你想要一位不愿透露姓名视图内翻与同尺寸 和链路的两种观点该IBOutlet UIView *newView,*oldView;的意见和提出新的观点之上

bool a = NO; 

@implementation ViewController 

- (IBAction)flip:(id)sender 
{ 
    if (a == NO) { 
     [UIView transitionFromView:oldView toView:newView 
        duration:1.0 
        options:UIViewAnimationOptionTransitionFlipFromLeft 
        completion:NULL]; 
     a = YES; // a = !a; 
    } 
    else { 
     [UIView transitionFromView:newView toView:oldView 
        duration:1.0 
        options:UIViewAnimationOptionTransitionFlipFromLeft 
        completion:NULL]; 
     a = NO; // a = !a; 
    } 
} 
+5

非常感谢!解决方案是使用容器视图。 – DanMunoz 2012-03-06 14:43:12

+0

@ Floris497,你救了我的一天。非常感谢:) – Ahmed 2012-05-19 09:22:56

+1

谢谢你。我有一种感觉,这是解决方案。我想这个过渡更像是一个窍门,它在父视图上做了一个翻转动画,并且通过交换你指定的子视图的一半。然后再一次,大多数动画等..在iPhone上是一个把戏:-) – Dermot 2012-07-28 03:55:03

2

使用容器视图来保存您的子视图,并使容器视图与您尝试设置动画的子视图具有相同的大小。

所以,你可以像这样设置你的意见。

self.view->“容器视图” - >子视图

2
**//flipping view continuously** 



bool a = NO; 


-(void)viewDidLoad 
{ 



// THIS is the canvass holding the two views this view is flipping 
UIView *v=[[UIView alloc]initWithFrame:CGRectMake(40, 40, 150, 150)]; 

    v.backgroundColor=[UIColor clearColor]; 

    [self.view addSubview:v]; 

    [v addSubview:yourfirstview]; 
    [v addSubview:yoursecondview]; 

// calling the method 

[NSTimer scheduledTimerWithTimeInterval:2.0 
            target:self 
            selector:@selector(flip) 
            userInfo:nil 
            repeats:YES]; 

} 



//flipping view randomly 

-(void)flip 

{ 

if (a == NO) 
{ 

[UIView transitionFromView:yourfirstview toView:yoursecondview duration:1.0 options:UIViewAnimationOptionTransitionFlipFromLeft completion:NULL]; 
     a = YES; 
    } 

else if(a==YES) 
{ 

[UIView transitionFromView:yoursecondview toView:yourfirstview duration:1.0 options:UIViewAnimationOptionTransitionFlipFromLeft completion:NULL]; 
    a = NO; 
    } 

} 
37

我得到这个问题也工作。我使用了Floris编写的代码,但尽管第一次“翻转”,但下一个翻转开始变得很怪异,前端UI视图中的按钮和标签丢失了位置。

我把下面的代码放到位,它工作正常。

几件事情需要注意:

  1. PANELVIEW是在具有嵌套在(子视图)另外两个UIViews的视图控制器一个UIView控制。第一个称为frontView,第二个称为backView。 (见下图)

image of the view and subviews in IB

  • 我对类
  • 称为displayingFront一个bool属性(在我的.h)

    @property BOOL displayingFront; 
    

    in my.m

    @synthesize displayingFront; 
    

    在我viewDidLoad方法

    self.displayingFront = YES; 
    

    这是住在我七拼八凑到,如果正面和背面UIViews两个按钮的.m代码...

    - (IBAction)flip:(id)sender 
    { 
        [UIView transitionWithView:self.panelView 
             duration:1.0 
             options:(displayingFront ? UIViewAnimationOptionTransitionFlipFromRight : 
               UIViewAnimationOptionTransitionFlipFromLeft) 
            animations: ^{ 
             if(displayingFront) 
             { 
              self.frontView.hidden = true; 
              self.backView.hidden = false; 
             } 
             else 
             { 
              self.frontView.hidden = false; 
              self.backView.hidden = true; 
             } 
            } 
    
            completion:^(BOOL finished) { 
             if (finished) { 
              displayingFront = !displayingFront; 
             } 
            }]; 
    } 
    
    +0

    我认为这比回答更干净 – RonPelayo 2014-02-14 05:28:50

    +0

    与这种方法的区别在于动画发生在翻转之后......所以frontView被隐藏,并且翻转后显示backView。上面详述的“transitionFromView”方法在中点添加了视图,所以在翻转完成时,“toView”已经显示。 – wuf810 2014-03-20 23:39:03

    +0

    谢谢!这解决了我错误的转换视图(标签)子视图的问题。他们分散在屏幕上。 – 2015-08-25 13:26:52

    2

    我用老派的动画固定的这个问题:

    [UIView beginAnimations:@"Flip" context:nil]; 
    [UIView setAnimationDuration:1]; 
    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; 
    [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:firstView cache:YES]; 
    
    [self addSubview:secondView]; 
    
    [UIView commitAnimations]; 
    

    另外,你可以删除的firstView:

    [firstView removeFromSuperview];