Где получить размер рамки пользовательского UIView в своем подклассе
Когда задается правильный размер кадра UIView, когда я добавляю свой пользовательский UIView с помощью раскадровки?
Я не могу получить правильный размер кадра в UIView init(frame: CGRect)
или init(coder aDecoder: NSCoder)
или awakeFromNib()
. Я получаю правильный размер в override func layoutSubviews()
, но на этот раз представление не добавляется в представление контроллера представления.
Edit:
Я хочу сделать это в подклассе UIView, потому что добавляю к нему UIView
слой CAGradientLayer
(который имеет тот же размер с моим представлением). Должен быть лучший способ, чем настроить представление в методе UIViewController
viewDidLayoutSubviews
.
Есть два вертикальных ограничения (трейлинг и ведущее пространство для просмотра), которые изменяют ширину моего пользовательского представления. Но ширина этих меток составляет 600, а не ширина экрана.
Ответы
Ответ 1
func viewWillAppear(_ animated: Bool)
Это вызывается на viewController после того, как иерархия представлений находится на месте и геометрия настроена.
Как правило, это лучшее место для размещения геометрического кода viewController и вызывается непосредственно перед запуском анимации перехода.
Затем следует вызов viewDidAppear
, который вызывается после завершения анимации перехода.
Обновление
как вы хотите установить это непосредственно в пользовательском представлении (а не в viewController), соответствующая функция UIView для переопределения - layoutSubviews
. Обязательно вызовите super.layoutSubviews()
в переопределении.
override func layoutSubviews() {
super.layoutSubviews()
//self.frame will be correct here
}
Это будет вызываться после viewController viewWillAppear
и до viewDidAppear
обновление 2: коллекции элементов управления
Кадры коллекции видят данные своих кадров из макета коллекции. Когда ячейка должна знать ее геометрию, вы можете переопределить applyLayoutAttributes
func applyLayoutAttributes(_ layoutAttributes: UICollectionViewLayoutAttributes!)
Один из атрибутов layoutAttributes по умолчанию - это свойство кадра. См. Также мой комментарий ниже о том, как извлечь фрейм непосредственно из коллекцииView.layout.
Ответ 2
У вас должен быть IBOutlet для вашего UIView и в методе viewDidLayoutSubviews()
, получить размер yourViewOutlet.frame.size
.
Ответ 3
Так как viewDidLayoutSubviews()
вызывается несколько раз, я бы рекомендовал использовать делегат viewDidAppear()
.
viewDidLoad()
вызывается до того, как был установлен любой кадр.
viewDidLayoutSubviews()
вызывается во время определения размера кадра и будет вызываться несколько раз с разными размерами кадров (обычно frameZero перед вычислением кадра).
viewDidAppear()
Все кадры установлены.