外面颜色问题的惊人角落半径

时间:2015-03-23 14:46:02

标签: ios ios7 ios8 calayer cornerradius

这是我添加到新视图控制器的代码:

- (void)viewDidLoad
{
    [super viewDidLoad];

    UIView *contentView = [[UIView alloc] initWithFrame:CGRectMake(50, 50, 200, 100)];
    [contentView setClipsToBounds:YES];
    [contentView setBackgroundColor:[UIColor blueColor]];
    [self.view addSubview:contentView];

    [[contentView layer] setBorderColor:[[UIColor lightGrayColor] CGColor]];
    [[contentView layer] setBorderWidth:1.0f];
    [[contentView layer] setCornerRadius:5.0f];
    [[contentView layer] setMasksToBounds:YES];
} 

结果:

enter image description here

如果看看角落,我们可以看到外面的蓝色像素:

enter image description here

3 个答案:

答案 0 :(得分:2)

您可以使用CAShapeLayer:

- (void)viewDidLoad
{
    [super viewDidLoad];

    UIView *contentView = [[UIView alloc] initWithFrame:CGRectMake(50, 50, 200, 100)];
    [self.view addSubview:contentView];

    CAShapeLayer *subLayer = [[CAShapeLayer alloc] init];
    [subLayer setFillColor:[UIColor blueColor].CGColor];
    [subLayer setStrokeColor:[UIColor grayColor].CGColor];
    [subLayer setLineWidth:6.0];
    [subLayer setPath:[UIBezierPath bezierPathWithRoundedRect:contentView.bounds cornerRadius:5.0].CGPath];

    [contentView.layer addSublayer:subLayer];
}

答案 1 :(得分:0)

我怀疑正在发生的是剪裁蒙版被应用于将其约束到角半径的图层,然后在背景图像的那个(顶部)内绘制边框,并且由于一个共同点称为抗锯齿的技术,你可以看到下面的一些像素。抗锯齿是用于尝试防止圆形和棱角线看起来锯齿状的技术。

编辑:

根据我的上一条评论,如果你想将它全部保存在一个视图中,使边框透明或宽度为0(底部为蓝色)以获得圆角,然后创建第二层稍大一点绘制边框,确保视图框大到足以容纳绘制的边框 边界。

答案 2 :(得分:0)

可悲的是,看起来苹果分别用已经圆角相互绘制背景和边框。当使用不同的背景颜色绘制两个相同的圆形rect bezier路径时,可以获得相同的结果。 它是由两个绘制元素的抗锯齿引起的。

迄今为止对我有用的解决方案: 在containerView中使用2个不同的视图。一个带边框,背景清晰,另一个带背景色。 在两个子视图上使用cornerRadius,但背景视图应插入半个像素:

CGRectMake(borderView.frame.origin.x + 0.5,
           borderView.frame.origin.y + 0.5,
           borderView.frame.size.width - 1.0,
           borderView.frame.size.height - 1.0);

这样你就不应该看到边框边缘的抗锯齿像素。