2016-03-24 2 views
2

У меня есть контроллер просмотра (с использованием раскадровки, если есть вопросы). Контроллер получил пользовательский вид внутри, назовем его AView. Вид раскладывается на раскадровку как объект UIView с пользовательским набором классов. Содержимое AView находится на отдельном XIB, потому что мне нужно это многократно использовать повторно. Вот как выглядит код:Изменения в макете iOS в пользовательском представлении не работают до тех пор, пока viewDidAppear не будет вызван

class VC: UIViewController { 
    @IBOutlet weak var aView: AView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     aView.setup(false) //doesn't work 
    } 

    override func viewWillAppear(animated: Bool) { 
     super.viewWillAppear(animated) 
     aView.setup(false) //doesn't work 
    } 

    override func viewDidAppear(animated: Bool) { 
     super.viewDidAppear(animated) 
     aView.setup(false) //do work but glitches 
    } 

} 

class AView: UIView { 

    required init?(coder aDecoder: NSCoder) { 
     //init stuff: loading nib, adding view from it 
    } 

    @IBOutlet weak var someView: UIView! //this view has all constraints which are required and additional rightConstraint which is inactive, for future use 
    @IBOutlet var leftConstraint: NSLayoutConstraint! 
    @IBOutlet var rightConstraint: NSLayoutConstraint! 

    func setup(shouldBeOnLeft: Bool) { 
     leftConstraint.active = true 
     rightConstraint.active = false 
     self.layoutIfNeeded() 
    } 
} 

Мне нужно настроить этот вид перед его появлением на основе некоторых параметров. Я изменяю только внутренний контент изнутри. Если я позвоню aView.setup(shouldBeOnLeft:) в viewDidLoad или viewWillAppear ограничения не обновляются или, возможно, делают, но я не вижу изменений. Если я переместил его на viewDidAppear, он работает, но, очевидно, я некоторое время вижу неправильные представления (состояние перед настройкой).

Вопрос заключается в следующем: как заставить его работать по назначению и без контроля вида формы управления представлением и независимо от того, как и где вызывается метод setup, если он не находится внутри или справа после 0CVC? Единственное, что нужно знать VC - это вызвать настройку с параметром.

+0

params не имеет значения. Важно то, что на основе этого я хотел бы изменить ограничения. то есть 'if params.count == 4 {constraintA.active = false}' – Kubba

+0

@beyowulf Я не понимаю - где я смотрю рамку VC? – Kubba

+0

@beyowulf Я отредактировал пример, чтобы быть более простым в отношении того, что на самом деле делает установка – Kubba

ответ

0

Хорошо, я понял, что из - но я на самом деле не нравится, в 100%

class VC: UIViewController { 
    @IBOutlet weak var aView: AView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     aView.setup(false) //now it does work 
    } 
} 

class AView: UIView { 

    required init?(coder aDecoder: NSCoder) { 
     //init stuff: loading nib, adding view from it 
    } 

    @IBOutlet weak var someView: UIView! //this view has all constraints which are required and additional rightConstraint which is inactive, for future use 
    @IBOutlet var leftConstraint: NSLayoutConstraint! 
    @IBOutlet var rightConstraint: NSLayoutConstraint! 

    func setup(shouldBeOnLeft: Bool) { 
     self.yesIfLeft = shouldBeOnLeft 
    } 

    private var yesIfLeft = false { 
     didSet{ 
      self.updateLayout() 
     } 
    } 

    private func updateLayout() { 
     leftConstraint.active = self.yesIfLeft 
     rightConstraint.active = !self.yesIfLeft 
     self.layoutIfNeeded() 
    } 

    override func layoutSubviews() { 
     super.layoutSubviews() 
     self.updateLayout() 
    } 
} 

Всего Дело в том, чтобы сохранить ссылку на настройки, которые вызывают изменения макета и обновлять их также в layoutSubviews(). Таким образом, VC не должен знать о внутренних компонентах AView (это большой плюс для меня), но для этого требуется, чтобы AView сохранил конфигурацию, которая является дополнительной работой. Я не отмечаю этот ответ так, как принято, потому что, может быть, у кого-то будет лучшая идея.

3

Вы должны вызвать его в viewDidLayoutSubviews(), на данный момент это установили параметры просмотра, и вы можете управлять изображением, прежде чем представлен пользователю (так, не глюки)

https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIViewController_Class/#//apple_ref/occ/instm/UIViewController/viewDidLayoutSubviews

Обсуждение Вызывается, чтобы уведомить контроллер представления о том, что его представление только что выложило его подпункты.

+0

. Так что в обычном режиме невозможно управлять собственными внутренними ограничениями после '' init'' и 'viewDidLayoutSubviews 'своего контроллера? Вернее, это возможно, но вы не увидите этого изменения. Правильно ли я это понимаю? – Kubba

+0

Я смущаюсь с вашим вопросом, после viewDidLayoutSubviews, ограничения берутся в «место» в представлении, и вы можете отрегулировать положение элементов, перед ним элементы не помещены, не получили? – UlyssesR

+0

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

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