从视图中删除模糊部分

时间:2015-10-16 10:25:00

标签: ios objective-c

Little Blur inside the selected part in red

我用渐变创建了这个视图,但是碰巧会出现模糊部分,我完全不知道如何删除它。

这是我的代码:

NSArray *grandientColor = [NSArray arrayWithObjects:
                           (id) [[UIColor colorWithRed:1 green:1 blue:0.79 alpha:1] CGColor],
                           (id) [[UIColor colorWithRed:1 green:0.93 blue:0.61 alpha:1] CGColor],
                           (id) [[UIColor colorWithRed:1 green:0.85 blue:0.43 alpha:1] CGColor],
                           (id) [[UIColor colorWithRed:1 green:0.7 blue:0.25 alpha:1] CGColor],
                           (id) [[UIColor colorWithRed:1 green:0.55 blue:0.18 alpha:1] CGColor],
                           (id) [[UIColor colorWithRed:1 green:0.3 blue:0.1 alpha:1] CGColor],
                           (id) [[UIColor colorWithRed:0.9 green:0.08 blue:0.04 alpha:1] CGColor],
                           (id) [[UIColor colorWithRed:0.75 green:0 blue:0.13 alpha:1] CGColor],
                           (id) [[UIColor colorWithRed:0.51 green:0 blue:0.14 alpha:1] CGColor],
                           (id) [[UIColor colorWithRed:0.29 green:0 blue:0.08 alpha:1] CGColor],nil
                           ];

UIView *viewGradient = [[UIView alloc] initWithFrame:CGRectMake(15.0f, 50.0f, 126.0f, 25.0f)];

viewGradient.layer.cornerRadius = 5;
viewGradient.layer.masksToBounds = YES;
viewGradient.layer.borderColor = [UIColor blackColor].CGColor;
viewGradient.layer.borderWidth = 2.0f;

CAGradientLayer *maskLayer = [CAGradientLayer layer];
maskLayer.opacity = 0.8;
maskLayer.colors = grandientColor;

// Hoizontal - commenting these two lines will make the gradient veritcal
maskLayer.startPoint = CGPointMake(0.0, 0.5);
maskLayer.endPoint = CGPointMake(1.0, 0.5);

maskLayer.bounds = viewGradient.bounds;
maskLayer.anchorPoint = CGPointZero;
[viewGradient.layer addSublayer:maskLayer];
[legendView addSubview:viewGradient];

请帮我解决这个问题。

感谢提前。

2 个答案:

答案 0 :(得分:1)

这实际上发生在双方,但由于渐变颜色较浅,因此在左侧更为明显。它发生的原因是因为圆角上的抗锯齿伪像;边框绘制在渐变的顶部,因此当添加部分绘制的边框像素时,错误边上的边框后面会出现渐变类型。

在您的情况下修复它的最简单方法是使渐变层略小于其父级。因此,您可以执行以下操作,而不是匹配边界:

// maskLayer.bounds = viewGradient.bounds;
maskLayer.anchorPoint = CGPointZero;
maskLayer.frame = CGRectInset(viewGradient.bounds, 1, 1);
maskLayer.cornerRadius = 4;

您还需要在设置框架的位置上方移动设置anchorPoint的线,并应用角半径,如上面的代码所示。

这会产生预期的效果:

Desired effect

如果我们使边框部分透明,您可以看到发生了什么:

enter image description here

答案 1 :(得分:0)

也许你在谈论cornerRadius不模糊? 你究竟是什么意思? 你有不透明度0.8它给透明 删除它:

[CATransaction setCompletionBlock:^{
    if(some other events happen){
       return;
    }
}];