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

Dan*_*noz 21 objective-c uiviewanimation uiviewanimationtransition ios

这是一个iPad项目,我有一个带有几个子视图的UIView,我试图使用[UIView transitionFromView:toView:duration:options:completion]为其中一个UIViews制作动画,但是当我运行此方法时,整个父视图被翻转!这是我正在使用的代码:

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];
Run Code Online (Sandbox Code Playgroud)

有关如何在不动画整个父视图的情况下在这些视图之间切换的任何想法?谢谢!

Flo*_*497 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 非常感谢!解决方案是使用容器视图. (5认同)
  • 这对我有用.但是,这些观点在翻转过程中被取消了.我的解决方案是使参考强大. (2认同)

小智 37

我也遇到了问题.我使用了Floris编写的代码,但是虽然它适用于第一个"翻转",但下一个翻转开始变得奇怪,前端UI视图上的按钮和标签丢失了位置.

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

有几点需要注意:

  1. panelView是ViewController上的UIView控件,其中嵌套了两个其他UIView(子视图).第一个叫做frontView,第二个叫做backView.(见下图)

IB中的视图和子视图的图像

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

(在我的.h)

@property BOOL displayingFront;
Run Code Online (Sandbox Code Playgroud)

在我的.m

@synthesize displayingFront;
Run Code Online (Sandbox Code Playgroud)

在我的viewDidLoad方法中

self.displayingFront = YES;
Run Code Online (Sandbox Code Playgroud)

这是.m中的代码,如果正面和背面的UIViews,我已经装配了两个按钮......

- (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;
                        }
                    }];
}
Run Code Online (Sandbox Code Playgroud)