Правильно маскируя CALayers - PullRequest
       41

Правильно маскируя CALayers

0 голосов
/ 02 января 2012

Я использую в отличном состоянии TapkuLibrary TKCalendarDayEventView и пытаюсь выборочно скруглить один из углов в представлении, как StuDev демонстрирует здесь .К сожалению, применение фрагмента кода StuDev приводит к тому, что EventView полностью исчезает из содержащего его TKCalendarDayTimelineView.Я добавляю этот фрагмент кода под текущий код в методе

+ (id)eventViewWithFrame:(CGRect)frame id:(NSNumber *)id startDate:(NSDate *)startDate endDate:(NSDate *)endDate title:(NSString *)title location:(NSString *)location;

.Я закомментировал код, который в противном случае устанавливает ширину, цвет или радиус границы в коде.Я удостоверился, что TKCalendarDayEventView не имеет никаких суперслоев, поскольку документы Apple предупреждают против добавления масок к слоям с суперслоями:

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

Я также попытался поиграться со свойствами backgroundColor и fillColor из maskLayer.В TKCalendarDayEventView я не вижу ничего, что могло бы помешать правильному применению этой маски.Что я могу делать не так?

1 Ответ

1 голос
/ 03 января 2012

Если вы установите точку останова в своем методе eventViewWithFrame:id:startDate:endDate:title:location:, вы увидите, что при создании представления событий вы устанавливаете фрейм на CGRectZero.Фрагмент кода, который затем устанавливает маску закругленного угла, использует CGRectZero в качестве фрейма слоя маски.

Вероятно, самый простой способ справиться с этим - переопределить метод TKCalendarDayEventView * setFrame:, например, так:

- (void)setFrame:(CGRect)newFrame
{
    if (!CGRectEqualToRect([super frame], newFrame)) {
        [super setFrame:newFrame];

        // Change the view's mask layer to fit the new frame.
        UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:self.bounds 
                                                       byRoundingCorners:UIRectCornerTopLeft
                                                             cornerRadii:CGSizeMake(15.0, 15.0)];
        CAShapeLayer *maskLayer = [CAShapeLayer layer];
        maskLayer.frame = self.bounds;
        maskLayer.path = maskPath.CGPath;
        self.layer.mask = maskLayer;
    }
}

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

...