2016-03-06 5 views
0

У меня есть UIViewController, который содержит пару UIView с, и UILabel, и он представлен полным экраном, встроенный в UINavigationController. В некомпактной среде с высотой (портрет) я хочу, чтобы ящики располагались друг над другом с ярлыком внизу - это работает как ожидалось. Теперь при повороте на компактную высоту (ландшафт) изображения, конечно, перемещаются, поэтому коробки теперь увеличиваются по ширине и уменьшаются по высоте. Я не хочу этого поведения. Вместо этого я хочу всегда позиционировать коробки, как если бы iPhone был на портрете, но метка должна вращаться, а также панель навигации, чтобы она оставалась читаемой в текущей ориентации. (Это означает, что высота взглядов будет немного более суженные в этом случае из-за навигационной панели.)Предотвращения вращающегося UIView подтаблицы, позволяют вращающейся родственный подвиды

Картина помогает объяснить намного лучше:

enter image description here

Таким образом, вопрос , как вы можете предотвратить вращение конкретных UIView s, сохраняя при этом ориентацию ландшафта в UIViewController?

Я видел другие подобные вопросы, но они используют устаревшие методы обнаружения вращения для определенной ориентации устройства, что не имеет отношения к iOS 8+. Этот вопрос заключается в том, как это сделать, если думать о размерах. Я считаю, что решение будет использовать viewWillTransitionToSize и animateAlongsideTransition, но то, что нужно сделать, мне не совсем понятно.

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

В UIViewController:

override func viewDidLayoutSubviews() { 
    super.viewDidLayoutSubviews() 

    let topPosition = self.topLayoutGuide.length 
    boxesContainer.frame = CGRectMake(20, topPosition, self.view.frame.size.width - 40, (self.view.frame.size.height - topPosition)/1.5) 

    boxesContainer.updateLayout() 
} 

В коробке контейнера UIView:

func updateLayout() { 
    box1.frame = // something based on self.frame 
    box2.frame = // ... 
} 
+0

Вы создаете эти виды в раскадровке, xib или коде? –

+0

Код @robmayoff – Joey

ответ

0

я выработала решение. По сути, я обнаруживаю, что ширина представления больше высоты и, если это так, поворачивает представление, содержащее поля. Сделайте это, сначала показывая контроллер вида и когда размер изменится. Затем выполняются вычисления для обновления фрейма этого представления по мере необходимости. Важно отметить, что в контейнере контейнера используется min его frame.size.width и frame.size.height, чтобы положить ящики.

override func viewWillAppear(animated: Bool) { 
    super.viewWillAppear(animated) 

    self.optimizeForSize(self.view.bounds.size) 
} 

override func viewDidLayoutSubviews() { 
    super.viewDidLayoutSubviews() 

    //calculate frame for the box container based on current frame 
    //... 

    boxContainer.updateLayout() 
} 

override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) { 
    super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator) 

    coordinator.animateAlongsideTransition({ (conext: UIViewControllerTransitionCoordinatorContext) -> Void in 
     self.optimizeForSize(size) 
     self.view.setNeedsLayout() //needed for iOS 8 
    }, completion: nil) 
} 

func optimizeForSize(size: CGSize) { 
    if size.width > size.height { 
     self.boxContainer.transform = CGAffineTransformMakeRotation(CGFloat(-M_PI/2.0)) 
    } else { 
     self.colorPicker.transform = CGAffineTransformIdentity 
    } 
} 
Смежные вопросы