2016-02-23 11 views
0

Я пишу приложение для iPhone. Для большинства сцен на нашей раскадровке поведение по умолчанию, когда телефон меняется с портретной ориентации на альбомную ориентацию, прекрасен. То есть это изменение макета мы хотим:Вращение одного вида и оставление другого без движения в Swift/Xcode для iOS при изменении ориентации

Portrait viewLandscape view

Но для одной из сцен в раскадровке я не хочу этого изменения макета. Вместо этого я хочу это:

Portrait viewDifferent landscape view

Я смущен о том, как достичь последнего изменения макета. Я могу использовать классы размера, чтобы гарантировать, что зазор в 100 пикселей для панели инструментов будет меняться снизу (портрет) вправо (пейзаж), но я не могу понять, как правильно сдерживать панель инструментов, особенно потому, что ротация должна произойти в коде , например

switch (UIDevice.currentDevice().orientation) { 
case UIDeviceOrientation.LandscapeLeft, UIDeviceOrientation.LandscapeRight: 
    self.toolbarView.transform = CGAffineTransformMakeRotation(CGFloat(3 * M_PI_2)) 
    // Reposition toolbarView into space to the right of the content's view 
    break 
default: 
    self.toolbarView.transform = CGAffineTransformIdentity 
    break 
} 

Что нужно сделать для правильной настройки панели инструментов?

ответ

1

Ограничения макета ограничивают frame данного вида. Давайте посмотрим, что документация говорит о взаимосвязи между frame и transform свойствами:

ПРЕДУПРЕЖДЕНИЯ Если преобразованием свойством не является преобразованием личности, значение этого свойства не определенно и, следовательно, должно быть проигнорировано.

...

если свойство преобразования содержит не тождественное преобразование, значение свойства фрейма не определено и не должны быть изменены. В этом случае вы можете переместить представление с помощью свойства центра и изменить размер, используя свойство bounds.

https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIView_Class/#//apple_ref/occ/instp/UIView/frame

Таким образом, вы не можете сделать это с помощью AutoLayout. Вы должны использовать center и bounds, и не позиционируют из кода:

-(void)layoutSubviews { 
    [super layoutSubviews]; 
    self.toolbarView.center = ... 
    self.toolbarView.bounds = ... 
} 
+0

Выглядит хорошо. Как отключить AutoLayout для элемента, чтобы манипуляции 'center' и' bounds' вы предлагали придерживаться? – dumbledad

+0

Если вы используете раскадровку/xibs, убедитесь, что вы установите флажок «удалить во время сборки» в ограничениях панели инструментов. Это позволяет позиционировать панель инструментов из кода (потому что во время выполнения не будет ограничений на панели инструментов), а также отключает предупреждения конструктора интерфейса (потому что в построителе интерфейса все еще существуют необходимые ограничения). –

+0

self.toolbarView на самом деле представляет собой составной UIView с собственными подчиненными (один другой UIView с некоторым текстом и изображением, а также UIToolbar). Привергнув переопределению layoutSubviews в положение self.toolbarView, могу ли я по-прежнему использовать автоматическую компоновку в своих подзонах или мне нужно все это выложить, манипулируя центрами и границами? – dumbledad

 Смежные вопросы

  • Нет связанных вопросов^_^