【问题标题】:Properly masking CALayers正确屏蔽 CALayers
【发布时间】:2012-01-02 00:15:29
【问题描述】:

我正在使用 TapkuLibrary 的其他出色的 TKCalendarDayEventView 并尝试选择性地将视图中的一个角变为 StuDev demonstrates here。不幸的是,应用 StuDev 的代码 sn-p 会导致 EventView 完全从其包含的 TKCalendarDayTimelineView 中消失。我在

中的当前代码下方添加此代码 sn-p

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

方法。我已经注释掉了在代码中设置边框宽度、颜色或半径的代码。我确保 TKCalendarDayEventView 没有任何超级层,因为 苹果文档警告不要向具有超级层的层添加蒙版:

将蒙版设置为新图层时,必须先将新图层的超图层设置为nil,否则行为未定义。

我也尝试过使用 maskLayer 的 backgroundColor 和 fillColor 属性。我在 TKCalendarDayEventView 中看不到任何可能阻止正确应用此蒙版的内容。我可能做错了什么?

【问题讨论】:

  • 我刚刚推出了一个代码文件,作为here 正在发生的事情的演示。 The offending file is here,从第 76 行开始,到第 95 行结束。
  • 我下载了您在问题下作为评论发布的测试代码。注释掉屏蔽代码(TKCalendarDayEventView.m 中的第 76-96 行)似乎对视图没有任何影响,因此看起来问题可能出在其他地方。是什么让您怀疑此代码导致了问题?
  • 嘿,StuDev!谢谢你的帮助! :) 您没有看到视图差异的原因是时间线应用程序显示 2012 年 1 月 2 日(今天)的事件,其中没有。如果您按后退箭头转到 2012 年 1 月 1 日,可以看到视图的差异,以查看差异。我还向 repo 推送了一个提交,以便默认显示 2012 年 1 月 1 日。拉下那个提交,或者转到 2012 年 1 月 1 日,你就会明白我的意思了。

标签: ios core-animation calayer cashapelayer tapku


【解决方案1】:

如果您在eventViewWithFrame:id:startDate:endDate:title:location: 方法中设置断点,您将看到在创建事件视图时将框架设置为CGRectZero。然后设置圆角遮罩的代码 sn-p 使用CGRectZero 作为遮罩层的框架。

可能最简单的处理方法是重写TKCalendarDayEventViewsetFrame: 方法,如下所示:

- (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;
    }
}

这样,每次更改视图的框架时,蒙版都会自动调整。

【讨论】:

    猜你喜欢
    • 2017-08-17
    • 1970-01-01
    • 2017-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-06
    • 1970-01-01
    • 2015-04-02
    相关资源
    最近更新 更多