如何使用圆角和边框宽度去除 UIImageView 上的黑边?

Posted

技术标签:

【中文标题】如何使用圆角和边框宽度去除 UIImageView 上的黑边?【英文标题】:How to remove black edge on UIImageView with rounded corners and a border width? 【发布时间】:2015-05-08 13:20:00 【问题描述】:

我有以下代码使我的 UITableView 的每个单元格中的 UIImageView 具有圆角:

- (void)awakeFromNib

    // Rounded corners.
    [[cellImage layer] setCornerRadius:([cellImage frame].size.height / 2)];
    [[cellImage layer] setMasksToBounds:YES];
    [[cellImage layer] setBorderColor:[[UIColor whiteColor] CGColor]];
    [[cellImage layer] setBorderWidth:3]; // Trouble!

我希望图像之间有一点间隙,并认为我可以利用边框宽度来实现这一点。下面是实际发生的图片:

就是那个微弱的黑色边框,我想知道怎么去掉。我想有一种方法可以使用边框宽度。如果没有,最好的方法可能是调整图像本身的大小并将边框宽度设置为 0。

【问题讨论】:

为什么要设置边框? 要在图像之间留出间隙,否则它们的顶部和底部边缘会接触 如何设置:- [[cellImage layer] setBorderColor:[[UIColor clearColor] CGColor]];? 然后让你的imageView小一点,而不是设置边框宽度 您可以将 imageview 的宽度和高度减小 6 px 以实现该间隙。 【参考方案1】:

您可以为蒙版创建贝塞尔路径,而不是使用圆角半径,为该路径创建一个形状图层,然后为图像视图的图层蒙版指定该形状图层:

CGFloat margin = 3.0;
CGRect rect = CGRectInset(imageView.bounds, margin, margin);
UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:CGPointMake(imageView.bounds.size.width/2, imageView.bounds.size.height/2) radius:radius startAngle:0 endAngle:M_PI*2 clockwise:NO];
CAShapeLayer *mask = [CAShapeLayer layer];
mask.path = path.CGPath;
imageView.layer.mask = mask;

【讨论】:

虽然这行得通,但我建议使用[UIBezierPath bezierPathWithArcCenter:CGPointMake(imageView.bounds.size.width/2 ,imageView.bounds.size.height/2) radius:radius startAngle:0 endAngle:M_PI*2 clockwise:NO] 而不是bezierPathWithOvalInRect:,因为它是一个真正的圆形(使用后者可以注意到一些角度)。 当图像视图下方有另一个背景而不是白色时不起作用。它显示该背景而不是白色。有什么解决的建议吗? 嗨@Rob,我想办法了。将通过合并您的代码发布新答案。会帮助开发者解决。【参考方案2】:

您正在做的是,您将配置文件图像和边框剪切在一起,这使得单元格的配置文件图像延伸到边框。

您缺少这一行:-

cellImage.clipsToBounds = YES;

【讨论】:

layer 没有 clipsToBounds 属性。 感谢@MattPotts 的纠正,我很着急 ;-)

以上是关于如何使用圆角和边框宽度去除 UIImageView 上的黑边?的主要内容,如果未能解决你的问题,请参考以下文章

xib设置lable设置圆角和边框,颜色

iOS:带边框的圆角矩形颜色

CALayer内边框圆角半径

storyboard或者Xib给View设置边框属性(颜色,宽度,圆角)

div+css如何实现圆角矩形

Android ImageView 设置圆角及外边框样式