Фиксированная ширина просмотра для книжной и альбомной ориентации с раскадровкой и автоматическим макетом?

Я работаю над этим приложением для iPad и думаю об использовании автоматического макета, чтобы облегчить себе жизнь. Я создал этот элемент управления боковой панелью, который позволяет пользователям переходить на другую страницу (точно так же, как контроллер панели вкладок, но он находится на левой стороне iPad). Теперь в альбомной ориентации я хочу, чтобы ширина этого представления составляла 256 пикселей, но когда iPad находится в портретной ориентации, я хочу, чтобы это представление имело ширину 100 пикселей. Как я могу использовать автоматический макет, чтобы закрепить ширину представления в зависимости от ориентации интерфейса?


person gossainapps    schedule 11.02.2013    source источник


Ответы (1)


Вы можете использовать вызов updateViewConstraints для изменения макета при изменении ориентации.

В приведенном ниже примере представление создается программно, но вы можете связать ограничение ширины боковой панели в построителе интерфейса, чтобы добиться того же.

Например:

//create a custom view using autolayout, this is the equivalent of you side bar
- (void)viewDidLoad{
  [super viewDidLoad];
  //create a custom view
  [self.view setTranslatesAutoresizingMaskIntoConstraints:NO];
  UIView *vw=[[UIView alloc] init];
  self.customView =vw;
  self.customView.backgroundColor = [UIColor blackColor];
  [self.customView setTranslatesAutoresizingMaskIntoConstraints:NO];
  [self.view addSubview:self.customView];

  NSArray *arr;

  //horizontal constraints
  arr = [NSLayoutConstraint constraintsWithVisualFormat:@"|-20-[vw]"
                                                options:0
                                                metrics:nil
                                                  views:NSDictionaryOfVariableBindings(vw)];
  [self.view addConstraints:arr];

  //vertical constraints
  arr = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-20-[vw(200)]"
                                                options:0
                                                metrics:nil
                                                  views:NSDictionaryOfVariableBindings(vw)];
  [self.view addConstraints:arr];

}

- (void)updateViewConstraints{

  [super updateViewConstraints];

  //remove the existing contraint
  if(self.widthConstraint!=nil){
    [self.view removeConstraint:self.widthConstraint];
  }
  //portait set width to 100 
  if(UIInterfaceOrientationIsPortrait(self.interfaceOrientation)){
    self.widthConstraint = [NSLayoutConstraint constraintWithItem:self.customView
                                                        attribute:NSLayoutAttributeWidth
                                                        relatedBy:NSLayoutRelationEqual
                                                           toItem:nil
                                                        attribute:0
                                                       multiplier:1.0
                                                         constant:100.0];
  }
  //landscape set width to 256
  else{
    self.widthConstraint = [NSLayoutConstraint constraintWithItem:self.customView
                                                        attribute:NSLayoutAttributeWidth
                                                        relatedBy:NSLayoutRelationEqual
                                                           toItem:nil
                                                        attribute:0
                                                       multiplier:1.0
                                                         constant:256.0];
  }
  [self.view addConstraint:self.widthConstraint];
}
person railwayparade    schedule 11.02.2013
comment
Привет, похоже, это работает, однако, когда я впервые поворачиваюсь, я получаю следующее сообщение отладчика: Невозможно одновременно удовлетворить ограничения. ... (‹NSLayoutConstraint: 0x20879850 H: [UIView: 0x1f5849b0 (100)]›, ‹NSLayoutConstraint: 0x1f57ef30 H: [UIView: 0x1f5849b0 (256)]›) Будет предпринята попытка восстановления, нарушив ограничение ‹NSLayoutConstraint: 0x1f UIView: 0x1f5849b0 (256)] › - person gossainapps; 12.02.2013
comment
Вы удаляете ограничение ширины перед его повторным добавлением? Есть два противоречащих друг другу ограничения ширины. т.е. 100 и 256 ширины. - person railwayparade; 12.02.2013
comment
Хорошо, я исправил. Вместо вызова [self.view removeConstraint: self.widthConstraint]; Мне пришлось вызвать [self.leftColumnContainerView removeConstraint: self.widthConstraint]; - person gossainapps; 12.02.2013