У меня UIView
есть около 8 различных CALayer
подслоев, добавленных к его слою. Если я изменяю границы представления (анимированные), то само представление сжимается (я проверял это с помощью a backgroundColor
), но размер подслоев остается неизменным .
Как это решить?
UITextView
(scrollEnabled = NO) и автоматическим макетом. У меня было текстовое представление, прикрепленное к его супервизору, которое, в свою очередь, имелоCALayer
нижнюю часть (границу), и я хотел, чтобы оно обновляло положение границы при изменении высоты текстового представления. По какой-то причинеlayoutSubiews
был вызван слишком поздно (и положение слоя было анимировано).Поскольку CALayer на iPhone не поддерживает менеджеры компоновки, я думаю, вам нужно сделать основной слой вашего представления настраиваемым подклассом CALayer, в котором вы переопределяете
layoutSublayers
установку кадров всех подслоев. Вы также должны переопределить+layerClass
метод вашего представления, чтобы вернуть класс вашего нового подкласса CALayer.источник
Я использовал это в UIView.
Работает для меня.
источник
CALayerDelegate
амиdraw(_:in:)
) мне также пришлось позвонить_anySubLayer.setNeedsDisplay()
. Тогда это сработало для меня.У меня такая же проблема. В слое настраиваемого вида я добавил еще два подслоя. Чтобы изменить размер подслоев (каждый раз, когда меняются границы настраиваемого представления), я реализовал метод
layoutSubviews
моего настраиваемого представления; внутри этого метода я просто обновляю фрейм каждого подслоя, чтобы он соответствовал текущим границам слоя моего подпредставления.Что-то вроде этого:
источник
2017 г.
Буквальный ответ на этот вопрос:
«Размер CALayers не изменился при изменении границ UIView. Почему?»
это к лучшему или к худшему
needsDisplayOnBoundsChange
по умолчанию false в
CALayer
.решение,
Действительно, направляю вас в этот QA
https://stackoverflow.com/a/47760444/294884
что объясняет, что, черт возьми,
contentsScale
делает критическая настройка; вам обычно необходимо установить это одинаково при установке needsDisplayOnBoundsChange.источник
Версия Swift 3
В настраиваемой ячейке добавьте следующие строки
Объявить первым
Затем добавьте следующие строки
источник
Как писал [Оле], CALayer не поддерживает автоматическое изменение размера на iOS. Поэтому вам следует настроить макет вручную. Моим вариантом было настроить рамку слоя внутри (iOS 7 и ранее)
или (начиная с iOS 8)
источник
В вашем пользовательском представлении вам нужно объявить переменную для вашего пользовательского уровня, не объявляйте переменную в области init. И просто запустите его один раз, не пытайтесь установить нулевое значение и повторно запустить
источник