2012-01-02 2 views
0

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

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

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

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

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

+0

Я только что нажал код в качестве демонстрации того, что происходит [здесь] (https://github.com/aashidham/TapkuCalDemo). [Нарушительный файл здесь] (https://github.com/aashidham/TapkuCalDemO/blob/master/TKCalendarDayEventView.m), начиная с строки 76 и заканчивая в строке 95. – Coder

+0

Я загрузил тестовый код, который вы разместили как комментарий по вашему вопросу. Комментирование кода маскировки (строки 76-96 в TKCalendarDayEventView.m), похоже, не оказывает никакого влияния на представление, и, следовательно, проблема может оказаться в другом месте. Что заставило вас подозревать, что этот код вызывает проблему? – Stuart

+0

Эй, StuDev! Спасибо за вашу помощь! :) Причина, по которой вы не видите разницы в представлениях, заключается в том, что приложение временной шкалы отображает события 2 января 2012 года (сегодня), которых нет. Разница в взглядах видна, если вы нажмете стрелку назад, чтобы перейти к 1 января 2012 года, чтобы увидеть разницу. Я также нажал фиксацию на репо, так что 1 января 2012 года отображается по умолчанию. Потяните это сообщение или перейдите на 1 января 2012 года, и вы увидите, что я имею в виду. – Coder

ответ

1

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

Наверное, самый простой способ справиться с этим было бы переопределить TKCalendarDayEventView «s 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; 
    } 
} 

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

+0

Работает как очарование. Благодаря! – Coder

Смежные вопросы