【问题标题】:How do I remove the ugly border around CALayer with cornerradius?如何使用cornerradius删除CALayer周围的丑陋边框?
【发布时间】:2014-07-01 05:49:52
【问题描述】:

我正在使用 Core Graphics 绘制一个简单的折线图。我创建了一个自定义类LineChart,它继承自UIControl。在此图表的顶部,我想添加一个实心小圆圈,在触摸时会显示动画(更改边框颜色)。

这是我在每个 (x,y) 点的圈子的代码。

var layer = CALayer()
layer.borderColor = UIColor.whiteColor().CGColor
layer.backgroundColor = UIColor.blackColor().CGColor
layer.cornerRadius = 8
layer.borderWidth = 4
layer.frame = CGRect(x: xValue, y: yValue, width: 16, height: 16)
self.layer.addSublayer(layer)

我想要一个带有白色边框的黑色中心。问题是我的外部白色边框周围有一个很小的丑陋黑色边框。

我怎样才能摆脱这个边界?我玩过抗锯齿设置或添加了一些顶部带有 1px 白色小边框的核心图形,但两者都没有成功。黑色的背景总是闪耀着,创造了这个外边界。我见过CALayer Border strange issue,但不敢相信我真的必须在每个数据点添加两层。

【问题讨论】:

  • 这是similar question。我知道没有办法解决这个问题,除了提供一个笨拙的解决方法。但是,由于我没有打扰swift,所以我的答案是objective-C。有兴趣吗?
  • 当然,Objective-C 完全没问题。
  • 这个答案是对的。更好的。 stackoverflow.com/questions/23073224/…

标签: ios core-graphics core-animation swift


【解决方案1】:

解决此问题的一种方法是创建CALayer 的自定义子类并覆盖drawInContext 方法以绘制带边框的圆圈。这是类的实现

@implementation DotLayer

- (instancetype)initWithFrame:(CGRect)frame
{
    self = [super init];
    if ( self )
    {
        self.frame = frame;
        self.backgroundColor = [UIColor clearColor].CGColor;
        self.borderColor = [UIColor whiteColor].CGColor;
        [self setNeedsDisplay];
    }
    return( self );
}

- (void)setBorderColor:(CGColorRef)borderColor
{
    [super setBorderColor:borderColor];
    [self setNeedsDisplay];
}

- (void)drawInContext:(CGContextRef)context
{
    CGRect rect = self.bounds;
    CGContextSetFillColorWithColor( context, self.borderColor );
    CGContextFillEllipseInRect( context, rect );

    rect = CGRectInset( self.bounds, 4, 4 );
    CGContextSetFillColorWithColor( context, [UIColor blackColor].CGColor );
    CGContextFillEllipseInRect( context, rect );
}

@end

这是添加点的代码

    DotLayer *layer = [[DotLayer alloc] initWithFrame:CGRectMake( xValue, yValue, 16, 16 )];
    [self.layer addSublayer:layer];

这是更改点边框颜色的代码

    layer.borderColor = [UIColor greenColor].CGColor;

【讨论】:

  • 如何更改触摸事件的外边框颜色(在我的情况下为白色边框)?使用您的解决方案,我必须在现有的基础上再画一个圆圈,对吗?我想重用已经存在的元素并简单地更改属性,例如myLayersArray[1].backgroundColor = UIColor.greenColor().CGColor
  • @zemirco -- 好点。我已经修改了答案,允许使用图层的 borderColor 属性将白色圆圈更改为不同的颜色。
  • 感谢您的帮助。我选择了两个单独的层 - github.com/zemirco/swift-linechart/blob/master/linechart/…
猜你喜欢
  • 1970-01-01
  • 2018-09-19
  • 2015-06-28
  • 1970-01-01
  • 2021-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-01
相关资源
最近更新 更多