Недавно я пишу расширение для фотографий для своего приложения.
Однако я обнаружил, что раскадровка расширения не может правильно определить кадр для каждого представления с помощью AutoLayout.
Например, я установил это в раскадровке:
Однако, когда я запускаю симулятор, он показывает:
Кроме того, когда я проверяю кадр для своего настроенного представления в didMoveToWindow()
, он также показывает неправильный кадр:
(66.0, 512.0, 468.0, 30.0)
На самом деле, настроенный ползунок отлично работает в раскадровке моего приложения.
Что со мной не так?
Ps: ползунок здесь представляет собой настроенный UIView
, а не UISlider
Изменить:
Заменив класс на UIView (с цветом) в раскадровке, я теперь уверен, что это не проблема ограничений Autolayout, потому что все работает нормально.
Затем я обнаружил, что проблема заключается в том, что я запускаю этот настроенный UIView, я настроил свои ручки и панель в методе didMoveToWindow()
, чьи кадры зависят от кадра представления. Когда я печатаю рамку представления в верхней части didMoveToWindow()
, рама вообще неверна.
Итак, я не могу получить правильный кадр UIView в его методе didMoveToWindow()
при использовании Autolayout?
Но это отлично работает в моем оригинальном приложении. Так что я в замешательстве.
Изменить2
Я использую функцию задержки для повторной проверки кадра через 5 секунд:
func delay(#seconds: Double, completion:()->()) {
let popTime = dispatch_time(DISPATCH_TIME_NOW, Int64( Double(NSEC_PER_SEC) * seconds ))
dispatch_after(popTime, dispatch_get_main_queue()) {
completion()
}
}
override func didMoveToWindow() {
delay(seconds: 5, {
println(self.frame)
})
}
Через 5 секунд кадр правильный! Таким образом, при вызове метода ограничения еще не применяются. Итак, теперь мне нужно получить обратный вызов в UIView, когда его ViewController superView завершит ViewDidLoad
.
Изменить3
Я нахожу ответ. Я должен настроить фрейм subView в методе layoutSubviews()
UIView. В этом случае я могу получить правильный кадр при использовании Autolayout.
На самом деле, после того, как ограничения UIView будут применены, он вызовет свой layoutSubviews()