Как изменить размер CAGradientLayer после поворота?

Я добавляю CAGradientLayer в представление. При автоматическом изменении размера вида (например, после поворота) размер слоя градиента не изменяется. Можно ли настроить градиент на автоматическое изменение размера так же, как и представление? Также обратите внимание, что я использую ограничения автоматического макета в представлении.

Вот что я делаю:

    CAGradientLayer *gradientLayer = [CAGradientLayer layer];
    gradientLayer.frame = CGRectMake(0.0, 0.0, frame.size.width, frame.size.height);
    gradientLayer.colors = [NSArray arrayWithObjects:
                       (id)[[UIColor colorWithRed:255.0/255.0f green:255.0/255.0f blue:255.0/255.0f alpha:1.0f] CGColor],
                       (id)[[UIColor colorWithRed:233.0/255.0f green:233.0/255.0f blue:233.0/255.0f alpha:1.0f] CGColor], nil];

    [self.layer insertSublayer:gradientLayer atIndex:0];

person memmons    schedule 22.03.2013    source источник
comment
возможный дубликат CALayer autoresizingMask не для iOS SDK?   -  person CodaFi    schedule 23.03.2013
comment
@CodaFi Немного другой вопрос. Кроме того, хотя на этот вопрос есть общепринятый ответ, в данном случае он, по-видимому, бесполезен.   -  person memmons    schedule 23.03.2013
comment
Вы правы, этот ответ ничего не стоит. Переопределите -layoutSubviews и назначьте туда свои кадры.   -  person CodaFi    schedule 23.03.2013


Ответы (2)


Вот два разных способа решить вашу проблему.

  1. Сделайте gradientLayer переменной экземпляра вместо локальной переменной. Затем переопределите layoutSubviews в своем классе представления, чтобы установить рамку градиентного слоя:

    - (void)layoutSubviews {
        [super layoutSubviews];
        _gradientLayer.frame = self.bounds;
    }
    
  2. Создайте подкласс UIView с именем GradientView и переопределите его метод +layerClass, чтобы он возвращал [CAGradientLayer class]. Используйте этот вид для рисования градиента вместо непосредственного использования слоя. Затем установите autoresizingMask представления градиента (или добавьте к нему ограничения, если вы используете автоматическую компоновку). см. этот ответ для примера.

Создание класса GradientView также заставит изменение размера вести себя правильно во время поворота, поэтому я рекомендую это решение.

person rob mayoff    schedule 18.11.2013
comment
♡ связанный ответ. Отличное объяснение проблемы (с анимированным GIF!) и решение. Отличная работа. - person memmons; 19.11.2013
comment
Включенная ссылка сделала объяснение очень простым! Спасибо Роб! - person Zack Weiner; 01.03.2015

Я изменяю размер границ слоя вручную, переопределяя метод setFrame: представления:

-(void)setFrame:(CGRect)frame
{
    [super setFrame:frame];
    _gradientLayer.bounds = CGRectMake(0, 0, CGRectGetWidth(frame), CGRectGetHeight(frame));
}
person Felix    schedule 22.03.2013
comment
setFrame: к сожалению, не вызывается во время таких событий, как вращение, поэтому это не сработает. - person memmons; 23.03.2013