2015-08-14 6 views
1

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

Как я могу получить информацию управления позиционированием как для портрета, так и для пейзажа при просмотре viewDidLoad? Есть какой-либо способ сделать это?

ответ

2

После добавления ограничений к виду и представлению, корректирующее его положение и размер в соответствии с размером и ориентацией устройства. Эта корректировка размера вида выполняется в методе viewDidLayoutSubviews, который вызывается после viewDidAppear. Если вы можете выйти из положения и размера элемента управления в этом методе, вы получите обновленный (размер и положение, как это видно на устройстве).

Но этот метод вызывается несколько раз после viewDidAppear, поэтому, если вы хотите добавить что-либо, я рекомендую добавить элемент управления в viewDidLoad, а затем обновить позицию в этом методе.

+0

Это определенно дает мне некоторые идеи о том, как подойти к этому. Я отвечу назад после того, как у меня был шанс попробовать это сегодня вечером. –

0

После работы с этим немного больше, я пришел с этим:

import UIKit 

class ViewController: UIViewController { 
    var pButtonFrame: CGRect! 
    var lButtonFrame: CGRect! 

    @IBOutlet weak var testButton: UIButton! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     // Do any additional setup after loading the view, typically from a nib. 
     NSNotificationCenter.defaultCenter().addObserver(self, selector: "screenRotated", name: UIDeviceOrientationDidChangeNotification, object: nil) 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    func screenRotated() { 
     //Set this only once, the first time the orientation is used. 
     if lButtonFrame == nil && UIDeviceOrientationIsLandscape(UIDevice.currentDevice().orientation) 
     { 
      lButtonFrame = testButton.frame 
     } 
     else if pButtonFrame == nil && UIDeviceOrientationIsPortrait(UIDevice.currentDevice().orientation) 
     { 
      pButtonFrame = testButton.frame 
     } 
    } 
} 

Я создал тестовую кнопку и позиционировали его с помощью ограничений на раскадровке. Я добавил наблюдателя в NSNotificationCenter для просмотра вращения экрана. Я сохраняю кадры для каждой из ориентаций в переменных CGRect. Проверяя каждую переменную для nil, я могу гарантировать, что они будут установлены только один раз, прежде чем я внесу какие-либо изменения на экране. Таким образом, я могу восстановить значения в своих оригиналах, если это необходимо. Я могу настроить показ и скрытие элементов управления здесь, или в viewDidLayoutSubviews.

0
import UIKit 

class ViewController: UIViewController { 
    var pButtonFrame: CGRect! 
    var lButtonFrame: CGRect! 

    @IBOutlet weak var btntest: UIButton! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     screenRotate() 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    func screenRotate() { 
     //Set this only once, the first time the orientation is used. 
     if lButtonFrame == nil && UIDeviceOrientationIsLandscape(UIDevice.currentDevice().orientation) 
     { 
      lButtonFrame = btntest.frame 
     } 
     else if pButtonFrame == nil && UIDeviceOrientationIsPortrait(UIDevice.currentDevice().orientation) 
     { 
      pButtonFrame = btntest.frame 
     } 
    } 
} 
Смежные вопросы