Где получить размер рамки пользовательского 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() Все кадры установлены.