ios - 从 View 中移除模糊部分

标签 ios objective-c

Little Blur inside the selected part in red

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

这是我的代码:

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];

请帮我解决这个问题。

提前致谢

最佳答案

这实际上发生在两侧,但由于渐变的颜色较浅,因此在左侧更为明显。发生这种情况的原因是圆角上的抗锯齿伪像;边框绘制在渐变之上,因此当添加部分绘制的边框像素时,渐变会在错误的一侧泄漏到边框后面。

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

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

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

这会产生预期的效果:

Desired effect

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

enter image description here

关于ios - 从 View 中移除模糊部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33168158/

相关文章:

objective-c - 带背景的自定义 AlertView

iphone - 使用 cocos2d 在 iPhone 上显示游戏分数的最佳方式?

ios - 对行数有限的 UITableView 禁用虚拟化(单元格重用)

ios - 如何实现@property(class, readonly, copy, nonatomic) NSArray<NSString *> * _Nullable readableTypeIdentifiersForItemProvider;

ios - 使用自动布局时,旋转一圈后我没有得到正确的响应

ios - 确定 iOS 应用程序的总磁盘使用量/文件大小

ios - 不在事件 View Controller 上时如何执行 segue "behind the scenes"?

ios - 无法在 Swift 3 中使用闭包语法

iphone - [Xcode]如何根据类型统计NSArray

iphone - 使用 iOS SDK 检查互联网连接