Я работаю над этим приложением для iPad и думаю об использовании автоматического макета, чтобы облегчить себе жизнь. Я создал этот элемент управления боковой панелью, который позволяет пользователям переходить на другую страницу (точно так же, как контроллер панели вкладок, но он находится на левой стороне iPad). Теперь в альбомной ориентации я хочу, чтобы ширина этого представления составляла 256 пикселей, но когда iPad находится в портретной ориентации, я хочу, чтобы это представление имело ширину 100 пикселей. Как я могу использовать автоматический макет, чтобы закрепить ширину представления в зависимости от ориентации интерфейса?
Фиксированная ширина просмотра для книжной и альбомной ориентации с раскадровкой и автоматическим макетом?
Ответы (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
Привет, похоже, это работает, однако, когда я впервые поворачиваюсь, я получаю следующее сообщение отладчика: Невозможно одновременно удовлетворить ограничения. ... (‹NSLayoutConstraint: 0x20879850 H: [UIView: 0x1f5849b0 (100)]›, ‹NSLayoutConstraint: 0x1f57ef30 H: [UIView: 0x1f5849b0 (256)]›) Будет предпринята попытка восстановления, нарушив ограничение ‹NSLayoutConstraint: 0x1f UIView: 0x1f5849b0 (256)] ›
- person gossainapps; 12.02.2013
Вы удаляете ограничение ширины перед его повторным добавлением? Есть два противоречащих друг другу ограничения ширины. т.е. 100 и 256 ширины.
- person railwayparade; 12.02.2013
Хорошо, я исправил. Вместо вызова [self.view removeConstraint: self.widthConstraint]; Мне пришлось вызвать [self.leftColumnContainerView removeConstraint: self.widthConstraint];
- person gossainapps; 12.02.2013