Пользовательская маска слоя для UIView

Я пытаюсь создать маску слоя для UIView, которая будет выступать в качестве выдвижной панели. Для этого мне нужен закругленный нижний правый угол со вставкой около 50 пикселей. До сих пор мне удавалось добиться этого эффекта, создав xib UIView с четким цветом фона и еще один меньший UIView (подпредставление) поверх него со вставкой 50 пикселей снизу и справа. Я хотел бы добиться этого эффекта без использования меньшего подпредставления. Другими словами, создайте маску со вставкой на 50 пикселей снизу и справа с закругленным углом в правом нижнем углу.

Теперь, когда я рисую маску на подвиде, она работает в любой ориентации экрана, в которой я начинаю, но когда устройство поворачивается, я получаю действительно противоречивые результаты. В моем классе subview у меня есть следующий код:

- (void)drawRect:(CGRect)rect
{
    CAShapeLayer *maskLayer = [CAShapeLayer layer];
    CGPathRef path = [[UIBezierPath bezierPathWithRoundedRect:[_subView bounds]
                                           byRoundingCorners:UIRectCornerBottomRight
                                                  cornerRadii:(CGSize){150.0, 150.0}] CGPath];
    [maskLayer setPath:path];
    [_subView.layer setMask:maskLayer];
    CGPathRelease(path);
}

Я не уверен, в чем проблема, но похоже, что с этим было бы легче справиться, если бы я мог добиться этого эффекта, используя один UIView с маской. Ниже приведен снимок экрана с подвидом. Очевидно, я немного новичок в технике маскировки.

Серый узор, показанный на изображении, - это главный контроллер представления с UIView из xib наверху. Прозрачность достигается за счет настройки основного вида xib на чистый цвет фона.

введите описание изображения здесь

РЕДАКТИРОВАТЬ Вот вид при открытии в альбомной ориентации. Я установил белый фон UIView, чтобы показать, что это вспомогательное представление не отображается должным образом при повороте устройства.

введите описание изображения здесь

А при повороте получается вот такой результат:

введите описание изображения здесь

Как уже упоминалось, поскольку основное представление отрисовывается правильно, кажется, что лучшим подходом было бы создать маску, которая дает аналогичный эффект, хотя не уверен, поэтому я здесь!

Надеюсь, я был достаточно ясен. Может кто-нибудь помочь с этим? Спасибо!


person Pheepster    schedule 15.09.2014    source источник


Ответы (2)


Вы не должны создавать или обновлять слои в drawRect:. Метод layoutSubviews - подходящее время для этого. Вы также можете повторно использовать маску. У вас также есть некоторые проблемы с сохранением / освобождением.

- (void)layoutSubviews {
    [super layoutSubviews];
    [self layoutMask];
}

- (void)layoutMask {
    CAShapeLayer *maskLayer = [self subviewMaskLayer];
    UIBezierPath *path =  [UIBezierPath bezierPathWithRoundedRect:_subView.bounds
        byRoundingCorners:UIRectCornerBottomRight cornerRadii:(CGSize){150.0, 150.0}];
    maskLayer.path = path.CGPath;
}

- (CAShapeLayer *)subviewMaskLayer {
    CAShapeLayer *mask = (CAShapeLayer *)_subView.layer.mask;
    if (mask == nil) {
        mask = [CAShapeLayer layer];
        _subView.layer.mask = mask;
    }
    return mask;
}
person rob mayoff    schedule 15.09.2014
comment
Спасибо за вашу помощь. Не могли бы вы прояснить мою проблему с удержанием / освобождением? Насколько я понимаю, CGPathRef должен быть выпущен путем вызова CGPathRelease () после завершения ... - person Pheepster; 16.09.2014
comment
У вас нет CGPath, поэтому вы не можете его выпустить. Посмотрите на Руководство по программированию управления памятью для Core Foundation. - person rob mayoff; 16.09.2014

Убедитесь, что ваш вид перерисовывается при вращении. Вам нужно будет переопределить этот метод:

 didRotateFromInterfaceOrientation

а затем убедитесь, что вы вызываете setNeedsDisplay и setNeedsUpdateConstratints.

Это гарантирует, что представление будет вызывать ваш метод рисования каждый раз при повороте.

person Brooks Hanes    schedule 15.09.2014
comment
Да, я это уже сделал. Сама перерисовка дает противоречивые результаты. - person Pheepster; 15.09.2014
comment
Вы используете автопрокладку? - person Brooks Hanes; 15.09.2014
comment
Можете ли вы описать некоторые результаты, кроме «противоречивых»? Это может помочь мне / другим. Кроме того, пробовали ли вы убрать автоматическое размещение? - person Brooks Hanes; 15.09.2014
comment
Спасибо за вашу помощь с этим. Правки опубликованы - person Pheepster; 15.09.2014