flip two subview не работает постоянно

Я нашел здесь решение Как перевернуть отдельный UIView (не переворачивая родительский вид)

но мне кажется, что это не работает. В Interface Builder я настроил все с помощью uiview и внутри этих двух uiview с одинаковым размером и первым представлением, которое будет отображаться сверху, и я создал три выхода для этих трех представлений.

В 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

person gcc    schedule 16.02.2014    source источник
comment
Можете ли вы опубликовать код, который внутри оператора if / else в вашем -flip методе? Мне кажется, что ссылка на firstView установлена ​​на nil где-то в вашем коде.   -  person Mischa    schedule 16.02.2014
comment
@Mischa я отредактировал начальный пост, добавив весь контроллер с методом переворота внутри   -  person gcc    schedule 16.02.2014


Ответы (1)


Я попытался восстановить вашу проблему в Xcode. Я добавил несколько строк кода для регистрации подпредставлений parentView до и после каждого перехода. Судя по журналам, ваш исходный фрейм вида (self.imageLogoView) в какой-то момент сбрасывается до ширины и высоты 0:

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

это означает, что он все еще там, но вы его просто не видите.

Очевидно, Autolayout отвечает за изменение размера рамки представления. Если вы отключите Autolayout для View Controller, переход работает нормально. (Чтобы отключить автораспределение, выберите соответствующий контроллер представления в раскадровке. В правом столбце (Утилиты) перейдите на первую вкладку  первая вкладка и снимите флажок " Использовать автоматическое размещение ".   использовать Autolayout )

С другой стороны, Autolayout считается хорошей вещью, или, по крайней мере, Apple продвигает ее как таковую. Поэтому, если вы хотите использовать Autolayout, вы должны сами позаботиться о фреймах вашего представления, добавив соответствующие ограничения. Сначала выберите свой imageLogoView и добавьте ограничения для ширины и высоты, установив соответствующие флажки, как показано на снимке экрана ниже. Затем проделайте то же самое со своим contactInfoView.

Ограничения Xcode для снимка экрана

Это должно делать свое дело.

person Mischa    schedule 16.02.2014