翻转两个子视图不能连续工作

时间:2014-02-16 16:51:09

标签: ios objective-c uiview uiviewanimation uiviewanimationtransition

我在这里找到了一个解决方案How to flip an individual UIView (without flipping the parent view)

但似乎这对我不起作用。在Interface Builder中,我已经使用uiview设置了所有内容,并在两个uiviews内部,大小相同,第一个视图显示在顶部,我为这3个视图创建了三个出口。

在viewDidLoad中:

 [self.view addSubview:self.contentView]
 [self.contentView addSubview:firstView]
 [self.contentView addSubview:secondView]
我有一个uigesture。当用户点击屏幕时,IBAction执行翻转:

-(IBAction)flip:(id *)sender
{
 if(faceUp){

       // execute transition from firstview to second
 }else{

      //execute transition from secondview to first
 }

 faceUp = !faceUp;
}

这项工作完全是我第一次点击并翻转从第一次到第二次,然后如果我再次点击翻转开始然后它没有任何结束,视图消失并保持容器视图显示什么,因为它的颜色是设置清除。 我怎么解决这个问题?

这是带有轻击手势方法和三个插座的控制器:

  #import "ContactViewController.h"
  #import "InfoContactView.h"
  #import "ImageLogoView.h"

  @interface ContactViewController ()
  @property (strong, nonatomic) IBOutlet InfoContactView *contactInfoView;
  @property (strong, nonatomic) IBOutlet ImageLogoView *imageLogoView;
  @property (nonatomic) BOOL faceUp;
  @property (strong, nonatomic) IBOutlet UIView *parentView;


  @end

 @implementation ContactViewController

 - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
 {
  self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
  if (self) {
    // Custom initialization
  }
 return self;
 }

- (void)viewDidLoad
{
  [super viewDidLoad];
 // Do any additional setup after loading the view.

  self.parentView.backgroundColor =[UIColor clearColor];
  [self.view addSubview:self.parentView];
  [self.parentView addSubview:self.contactInfoView];
    [self.parentView addSubview:self.imageLogoView];


    self.faceUp = NO;
 }

- (void)didReceiveMemoryWarning
{
     [super didReceiveMemoryWarning];
   // Dispose of any resources that can be recreated.
}


-(void)setFaceUp:(BOOL)faceUp
{
    _faceUp = faceUp;

}

-(void)setParentView:(UIView *)parentView
{
    _parentView =parentView;
}

-(void)setContactInfoView:(InfoContactView *)contactInfoView
{
 _contactInfoView = contactInfoView;
}

-(void)setImageLogoView:(ImageLogoView *)imageLogoView
{
  _imageLogoView = imageLogoView;
}

- (IBAction)showInfo:(UITapGestureRecognizer *)sender {




  if (self.faceUp == NO) {
      [UIView transitionFromView:self.imageLogoView toView:self.contactInfoView
                        duration:1.5
                         options:UIViewAnimationOptionTransitionFlipFromLeft
                      completion:NULL];
      NSLog(@"Pass from logo to info : imageLogoView = %@",self.imageLogoView.description);

      NSLog(@"dettagli = %@",self.contactInfoView);



  }
   else if(self.faceUp == YES){
      [UIView transitionFromView:self.contactInfoView toView:self.imageLogoView
                        duration:1.5
                         options:UIViewAnimationOptionTransitionFlipFromRight
                      completion:NULL];

      NSLog(@"Pass from info to logo: imageLogoView = %@",self.imageLogoView.description);

      NSLog(@"dettagli = %@",self.contactInfoView);

  }

  self.faceUp = !self.faceUp;

 }




 @end

1 个答案:

答案 0 :(得分:0)

我试图在Xcode中重建你的问题。我在每次转换之前和之后添加了一些代码行来记录parentView的子视图。从日志中判断,您的初始视图的框架(self.imageLogoView)在某个时刻重置为宽度和高度为0:

<UIView: 0x8b84310; frame = (159.5 284.5; 0 0); autoresize = W+H; layer = <CALayer: 0x8b84370>>

这意味着它仍然存在但你却看不到它。

显然 Autolayout负责调整视图框架的大小。如果您为View Controller停用Autolayout,则转换工作正常。 (要取消激活Autolayout,请在故事板中选择相应的View Controller。在右栏(实用工具)转到第一个选项卡first tab并取消选中“Use Autolayout”use Autolayout

另一方面,Autolayout被认为是一件好事,或者至少它被Apple推广。因此,如果您希望使用Autolayout,您必须通过添加适当的约束来自己处理视图的框架。首先选择您的imageLogoView并通过选中相应的框添加宽度和高度的约束,如下面的屏幕截图所示。然后对您的contactInfoView执行相同操作。

Screenshot Xcode Constraints

这应该可以解决问题。

相关问题