Как динамически обновлять размеры CAGradientLayer?

У меня есть свой подкласс UIButton которому я хотел добавить в качестве фона градиент. Я создал extension для UIView и с помощью этого метода добавляю слой с градиентом. При таком подходе размеры слоя не изменяются при повороте экрана, или при использовании .contentEdgeInsets. Можно ли исправить данное поведение или существует другой способ реализации текущей задачи?
  • Вопрос задан
  • 67 просмотров
Решения вопроса 1
ManWithBear
@ManWithBear
Swift Adept, Prague
Изменение размеров CALayer'a лежит полностью на его пользователе.
Поэтому вам нужно при каждом изменении frame у вью, менять положиние / размер слоя
Пример:
class MyView: UIView {
    let gradient: CALayer 
    ...
    override func layoutSubviews() {
        super.layoutSubviews()
        gradient.frame = self.bounds
    }
}


Если прям очень хочется через экстеншн, то примерно так:
private var gradientPropertyKey: UInt8 = 0
extension UIView {
    func addNiceGradient() {
        let gradient =  < тут ваш слой >
        layer.addSublayer(gradient)
        let observation = layer.observe(\.bounds) { [weak gradient] layer, _ in
            gradient?.frame = layer.bounds
        }
        objc_setAssociatedObject(self, &gradientPropertyKey, observation, .OBJC_ASSOCIATION_RETAIN)
    }
}

Но будет работать хуже, да и уверены что хотите в ObjC Runtime без причины лезть?
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
YeahGarage
@YeahGarage
Developer
А если поставить у под слоя градиента больше площадь заливки а у кнопки или под слоя добавить masksToBounds = true?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Mint Rocket Казань
от 100 000 до 150 000 ₽
1312 Inc. Сочи
от 120 000 до 150 000 ₽
МТС Москва
от 140 000 до 250 000 ₽