2016-04-03 2 views
0

У меня есть ViewController класса, который имеет переменную textField, который сконфигурирован , когда он установлен в viewDidLoad способе ViewController.Обновления autolayout ограничения в зависимости от ориентации

class ViewController: UIViewController { 

    weak var textField: UITextField! { 
     didSet { 
      textField.delegate = self 
      textField.placeholder = "Enter Text" 
      view.addSubview(textField) 
      view.addConstraint(NSLayoutConstraint(item: textField, attribute: .Width, relatedBy: .Equal, toItem: view, attribute: .Width, multiplier: 0.80, constant: 0)) 
      view.addConstraint(NSLayoutConstraint(item: textField, attribute: .Height, relatedBy: .Equal, toItem: view, attribute: .Height, multiplier: 0.05, constant: 0)) 
      view.addConstraint(NSLayoutConstraint(item: textField, attribute: .CenterX, relatedBy: .Equal, toItem: view, attribute: .CenterX, multiplier: 1, constant: 0)) 
      view.addConstraint(NSLayoutConstraint(item: textField, attribute: .CenterY, relatedBy: .Equal, toItem: view, attribute: .CenterY, multiplier: 1, constant: 0)) 
     } 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     textField = UITextField() 
    } 
} 

В список добавлен набор ограничений автоматической компоновки. Я хочу это текстовое поле быть центрированы в середине (.CenterX и .CenterY), чтобы быть 80% (5%), ширина (высота) из view рассчитывается в портрет режиме ViewController «ы.

Если ориентация устройства (UIDevice.currentDevice().orientation) поворачиваются в альбомной ориентации, или представлена ​​от альбомной ориентации, я хочу ширину (высота) оставаться такими же, как для портретной ориентации.

Изменение attribute для toItem в:

view.addConstraint(NSLayoutConstraint(item: textField, attribute: .Height, relatedBy: .Equal, toItem: view, attribute: .Height, multiplier: 0.05, constant: 0)) 

к:

attribute: (UIDeviceOrientationIsPortrait(UIDevice.currentDevice().orientation) ? .Height : .Width) 

Не делать трюк, как я предполагаю, что textField не получает (повторно) устанавливается, когда устройство переключает ориентацию. Кроме того, эта проверка кажется немного сложной для Swift. Я пропустил трюк с автозапуском?

ответ

1

На самом деле проблема в вашем коде, что вы не установили translatesAutoresizingMaskIntoConstraints из TextField в false, всякий раз, когда вы хотите использовать ограничение автоматической компоновки, то вы должны установить translatesAutoresizingMaskIntoConstraints в целях false.

Я обновил ваш код и посмотрел его работу.

class ViewController: UIViewController, UITextFieldDelegate {  
    weak var textField: UITextField! { 
     didSet { 
      textField.delegate = self 
      textField.placeholder = "Enter Text" 
      view.addSubview(textField) 
      // to see the size of textField 
      textField.backgroundColor = UIColor.purpleColor() 

      textField.translatesAutoresizingMaskIntoConstraints = false 

      view.addConstraint(NSLayoutConstraint(item: textField, attribute: .Width, relatedBy: .Equal, toItem: view, attribute: .Width, multiplier: 0.80, constant: 0)) 
      view.addConstraint(NSLayoutConstraint(item: textField, attribute: .Height, relatedBy: .Equal, toItem: view, attribute: .Height, multiplier: 0.05, constant: 0)) 
      view.addConstraint(NSLayoutConstraint(item: textField, attribute: .CenterX, relatedBy: .Equal, toItem: view, attribute: .CenterX, multiplier: 1, constant: 0)) 
      view.addConstraint(NSLayoutConstraint(item: textField, attribute: .CenterY, relatedBy: .Equal, toItem: view, attribute: .CenterY, multiplier: 1, constant: 0)) 
     } 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     textField = UITextField() 

    } 
} 
+0

Хорошее место - спасибо. – Alex

+0

@Alex Ваше приветствие. Если вам нужен более простой способ борьбы с программным ограничением, то посмотрите -https: //github.com/keshavvishwkarma/KVConstraintExtensionsMaster –

+0

Я все еще не уверен, что если указать ограничения в относительном процентном коэффициенте, это лучший подход? Таким образом, ваши подходы не зависят от модели iPhone, скажем. Думаю, это похоже на CSS. Любые мысли по этому поводу? Благодарю. – Alex

0

Одним из решений было бы получить фиксированные координат границы экрана (IOS> = 8) и настроить первые два ограничения надлежащим образом:

class ViewController: UIViewController, UITextFieldDelegate { 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     let textField = UITextField() 
     textField.translatesAutoresizingMaskIntoConstraints = false 
     textField.delegate = self 
     textField.placeholder = "Enter Text" 
     view.addSubview(textField) 

     textField.backgroundColor = UIColor.redColor() 
     textField.textAlignment = .Center 

     let fixedScreenBounds = UIScreen.mainScreen().fixedCoordinateSpace.bounds 

     NSLayoutConstraint.activateConstraints([ 
      NSLayoutConstraint(item: textField, attribute: .Width, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 0, constant: 0.8*fixedScreenBounds.width), 
      NSLayoutConstraint(item: textField, attribute: .Height, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 0, constant: 0.05*fixedScreenBounds.height), 
      NSLayoutConstraint(item: textField, attribute: .CenterX, relatedBy: .Equal, toItem: view, attribute: .CenterX, multiplier: 1, constant: 0), 
      NSLayoutConstraint(item: textField, attribute: .CenterY, relatedBy: .Equal, toItem: view, attribute: .CenterY, multiplier: 1, constant: 0) 
      ]) 
    } 
} 

Кроме того, имейте в виду, что, поскольку вы создаете текстовое поле в коде и вы хотите использовать автозапуск, вы должны установить для его translatesAutoresizingMaskIntoConstraints значение false.

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