У меня есть представление, в котором есть строки и столбцы изображений.
Если размер этого представления изменен, мне нужно изменить положение представлений изображений.
Это представление является частью другого представления, размер которого изменяется.
Есть ли способ определить, когда размер этого представления изменяется?
Ответы:
Как прокомментировал Ули ниже, правильный способ сделать это - переопределить
layoutSubviews
и разместить там imageViews.Если по какой-то причине вы не можете создать подкласс и переопределить
layoutSubviews
, наблюдениеbounds
должно работать, даже если оно немного грязное. Хуже того, есть риск при наблюдении - Apple не гарантирует, что KVO работает на классах UIKit. Прочтите обсуждение с инженером Apple здесь: Когда будет выпущен связанный объект?оригинальный ответ:
Вы можете использовать наблюдение за ключом:
и реализовать:
источник
viewWillTransition
и т.layoutSubviews
прежнему рекомендуемый метод, если, в зависимости от текущего размера представления, необходимо добавить / удалить разные подпредставления и добавить / удалить различные ограничения?В
UIView
подклассе могут использоваться наблюдатели свойств :Без подкласса наблюдение ключевого значения с помощью умных путей к ключам подойдет:
источник
frame
это производное свойство, вычисляемое во время выполнения. не отменяйте это, если у вас нет очень разумной и знающей причины для этого. иначе: используйтеbounds
или (еще лучше)layoutSubviews
.override var bounds: CGRect { didSet { layer.cornerRadius = bounds.size.width / 2 }}
bounds
илиframe
изменения не гарантируется, в зависимости от того, где вы помещаете свое представление в иерархию представлений.layoutSubviews
Вместо этого я бы переопределил . Смотрите это и это ответы.Создайте подкласс UIView и переопределите layoutSubviews
источник
Swift 4 keypath KVO - так я обнаруживаю автоповорот и переход на боковую панель iPad. Должен работать любой вид. Пришлось наблюдать за слоем UIView.
источник
.layer
сделали свое дело! Вы знаете, почему использованиеview.observe
не работает?Вы можете создать подкласс UIView и переопределить
setFrame: (CGRect) кадр
метод. Это метод, вызываемый при изменении кадра (т. Е. Размера) представления. Сделайте что-нибудь вроде этого:
источник
setFrame:
мойUITextView
подкласс не был вызван во время изменения размера, вызванного авторотацией, тогда какlayoutSubviews:
был. Примечание: я использую автоматический макет и iOS 7.0.setFrame:
.frame
является производным свойством. Смотрите мой ответДовольно старый, но все же хороший вопрос. В примере кода Apple и в некоторых их частных подклассах UIView они переопределяют setBounds примерно так:
Переопределение
setFrame:
- НЕ хорошая идея.frame
происходит отcenter
,bounds
иtransform
, поэтому iOS не обязательно будет вызыватьsetFrame:
.источник
setBounds:
он также не вызывается при установке свойства frame (по крайней мере, в iOS 7.1). Это может быть оптимизация, которую Apple добавила, чтобы избежать дополнительного сообщения.frame
иbounds
являются производными от основы представленияCALayer
; они просто обращаются к геттеру слоя. ИsetFrame:
устанавливает рамку слоя, аsetBounds:
устанавливает границы слоя. Таким образом, вы не можете просто отвергнуть одно или другое. Кроме того,layoutSubviews
вызывается чрезмерно (не только при изменении геометрии), поэтому это не всегда может быть хорошим вариантом. Все еще ищу ...Если вы находитесь в экземпляре UIViewController, переопределение
viewDidLayoutSubviews
помогает.источник
UIView
экземплярами иUIViewController
экземплярами. Так что, если у вас естьUIView
экземпляр без подключенного VC, другие ответы будут отличными, но если вы оказались подключенными к VC, это ваш мужчина. Извините, это не применимо к вашему случаю.