滚动时使用UIBezierPath绘制的圆角出现问题

4

我是iOS新手。我正在制作一个聊天应用程序。我使用UITableView来显示消息聊天(一个单元格 - 一条消息)。
在每个单元格中,我会将消息圆角化为2、3或4个角(类似于Facebook聊天)。

为了实现圆角化,我在每个Tableview CelllayoutSubView中使用UIBezierPath

UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:self.messageView.bounds byRoundingCorners:(UIRectCornerTopLeft | UIRectCornerBottomLeft) cornerRadii:CGSizeMake(3.0, 3.0)];

CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init];
maskLayer.frame = self.bounds;
maskLayer.path  = maskPath.CGPath;
self.messageView.layer.mask = maskLayer;

在此输入图片描述

问题是:当布局首次初始化时,一切都正常,但当我滚动时,有些单元格的圆角会出现错误(我发现问题有时是因为滚动时self.messageView.bounds返回错误的值,因此UIBezierPath绘制了错误的圆角),但我不知道为什么。

我该如何防止这种情况发生? 或者我是否有另一种方法来圆角视图而不使用UIBezierPath(我搜索过,但只找到使用UIBezierPath来圆角UIView的方法 :( )?
感谢任何帮助。


尝试这段代码 [v.layer setCornerRadius:30.0f];// 边框 [v.layer setBorderColor:[UIColor lightGrayColor].CGColor]; [v.layer setBorderWidth:1.5f];// 阴影 [v.layer setShadowColor:[UIColor blackColor].CGColor]; [v.layer setShadowOpacity:0.8]; [v.layer setShadowRadius:3.0]; [v.layer setShadowOffset:CGSizeMake(2.0, 2.0)]; - Jigar
@DarjiJigar,我的需求是将消息的2、3或4个角进行圆角处理,而你的代码只能在4个角上进行圆角处理。 - Linh
请查看此链接:https://dev59.com/2m445IYBdhLWcg3wdqEL,但我猜测(而您也这么说)问题不在绘制上,而是在获取正确边界上,因此我会专注于修复它而不是避免使用Bezier路径。 - Injectios
@Injectios 谢谢你。但是在你提供的链接中,被接受的答案是5年前的,还有一个新的答案使用了UIBezierPath,就像我的代码一样。 - Linh
2个回答

4

我曾遇到类似的问题,并通过将我的圆角代码放在tableView:willDisplayCell:forRowAtIndexPath内部来解决它。这将允许Cocoa适当地调整大小。


0

我曾经遇到过类似的问题,通过将代码移动到layoutSubviews()中解决了它。

override func layoutSubviews() {
        DispatchQueue.main.async {
            self.maskLayer.path = UIBezierPath(roundedRect: self.messageBGView.bounds, byRoundingCorners: [.topLeft, .topRight,.bottomLeft], cornerRadii: CGSize(width: 20, height: 20)).cgPath
            self.messageBGView.layer.mask = self.maskLayer
            self.messageBGView.layer.masksToBounds = true
        }
    } 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接