如何翻转单个UIView(而不翻转父视图)

21

这是一个iPad项目,其中我有一个UIView和几个subView,我想使用[UIView transitionFromView:toView:duration:options:completion]来对其中的一个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];
任何想法如何在不对整个父视图进行动画处理的情况下在这些视图之间切换吗? 谢谢!
6个回答

71

这段代码可能对你有所帮助:

将你想要翻转的两个视图放在一个大小相同的未命名视图中,并将 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
1
谢谢这个。我有一种感觉这就是解决方案。我猜过渡更像是一个技巧,它在父视图上执行了一个翻转动画,并在中途替换了你指定的子视图。不过话说回来,在iPhone上大多数动画等都是一种技巧 :-) - Dermot
2
这对我有用。然而,在翻转期间,视图被释放了。我的解决方案是使引用强引用。 - Juan Haladjian
1
Floris497,一个字典可能会对你有所帮助 ;) - return true
@returntrue也许会帮助我,但是以什么形式呢? :P - Floris497
显示剩余3条评论

37

我也遇到了这个问题。我使用了Floris编写的代码,但虽然它在第一个“翻转”工作正常,但下一个翻转开始出现问题,前面UI视图上的按钮和标签失去了位置。

我将下面的代码放入了适当的位置,现在一切都正常了。

需要注意几点:

  1. panelView是ViewController上的一个UIView控件,它有两个嵌套在其中的其他UIView(子视图)。 第一个称为frontView,第二个称为backView。(见下面的图片)

IB中视图和子视图的图像

  1. 我在类上有一个名为displayingFront的bool属性

(在我的.h文件中)

@property BOOL displayingFront;

在我的.m文件中

@synthesize displayingFront;

在我的viewDidLoad方法中

self.displayingFront = YES;

这是我在.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;
                        }
                    }];
}

我认为这比答案更清晰。 - RonPelayo
这种方法的不同之处在于翻转后动画发生...因此,在翻转后,frontView 被隐藏,backView 显示。上面详细介绍的 "transitionFromView" 方法在中点添加视图,因此当翻转完成时,“toView”已经显示出来了。 - wuf810
谢谢!这解决了我在转换视图(标签)的错位子视图问题。它们散布在屏幕上。 - Boris Nikolic
哇哦!太棒了!非常感谢。 - iGatiTech
太好了...它节省了我的时间。 - Jagat Dave

3
使用容器视图来容纳你的子视图,并将容器视图的大小设置为你要动画的子视图的大小。
因此,你可以像这样设置你的视图。
self.view -> “一个容器视图” -> 子视图

2

我想更新Steve Parker在SWIFT 4中的答案:

var displayBlankView:Bool = true

UIView.transition(with:flipView, duration:1.0, options:displayBlankView ? .transitionFlipFromLeft:.transitionFlipFromRight, animations:{
        if(self.displayBlankView){
            self.view1.isHidden=true
            self.view2.isHidden=false
        }else{
            self.view1.isHidden=false
            self.view2.isHidden=true
        }
    }, completion:{
        (finished: Bool) in
        self.displayBlankView = !self.displayBlankView;

    })

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

}

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接