ios - 如何使用 cornerradius 去除 CALayer 周围的丑陋边框?

标签 ios core-graphics core-animation swift

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

这是我的圆圈在每个 (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)

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

tiny ugly border around CALayer

我怎样才能摆脱这个边界?我玩过抗锯齿设置或添加了一些顶部带有 1px 白色小边框的 Core Graphics,但两者都没有奏效。黑色背景总是闪耀并创造了这个外部边界。我看过CALayer Border strange issue但无法相信我真的必须在每个数据点添加两层。

最佳答案

解决该问题的一种方法是创建 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;

关于ios - 如何使用 cornerradius 去除 CALayer 周围的丑陋边框?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24503250/

相关文章:

ios - JSON 仅显示所有单元格中的最后一个可选 Swift 4

cocoa - 硬件加速/性能以及不同 macOS 图形 API、框架和层的链接

objective-c - 将 PDF 文档的创建从 iOS 移植到 Mac OS X

ios - CAShapeLayer - 具有显式路径的性能

objective-c - 透明层支持 View

ios - 以编程方式创建的 Animate NSLayoutConstraint

ios - ActivityIndi​​cator(微调器)在展开可选值时意外发现 nil 错误

ios - 为什么当线本身加倍时连接不四舍五入?

ios - 带有 CALayer.affineTransform 的 CABasicAnimation 不工作

ios - OBJ-C 操作指南 : App using BLE connection and iBeacon in same device