单元格中的 UIView - 不能圆右角

Posted

技术标签:

【中文标题】单元格中的 UIView - 不能圆右角【英文标题】:UIView in cell -- Can't round right-hand corners 【发布时间】:2014-11-14 16:12:11 【问题描述】:

我在静态表格视图单元格中有一个矩形 UIView 对象。我有一个物体的出口,我试图有选择地圆角,但它不会在右边圆角。这是它在故事板中的样子:

我要配置的视图是淡黄色的。除了确认另一个视图没有被剪裁之外,红色视图没有任何实际用途。

没有约束问题或错误。这是它在 4S 上的外观:

我在tableView:willDisplayCell:forRowAtIndexPath:做配置

使用此代码(myView 是上面淡黄色视图的出口):

self.myView.layer.cornerRadius = 5.0f;
self.myView.clipsToBounds = YES;

我得到这个结果:

所有 4 个角都是圆形的。但我需要有选择地圆角,通常是两个顶角或两个底角。下面是圆两个底角的代码:

CAShapeLayer *shape = [[CAShapeLayer alloc] init];
shape.path = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(0, 0, self.myView.bounds.size.width, self.myView.bounds.size.height)
                                   byRoundingCorners:UIRectCornerBottomLeft | UIRectCornerBottomRight
                                         cornerRadii:CGSizeMake(5.0f, 5.0f)].CGPath;
self.myView.layer.mask = shape;
self.myView.layer.masksToBounds = YES;

结果如下:

它不适用于任何一个右上角。它适用于任一左角。

我在普通视图控制器(表视图之外)上使用视图对象测试了贝塞尔代码,代码按预期工作——我可以有选择地绕过任何角落。

任何想法为什么它不能在表格视图单元格中工作?

如何在不借助绘图代码的情况下完成此操作?

【问题讨论】:

【参考方案1】:

我认为这是因为您的视图的框架,因此在您制作图层蒙版后边界会发生变化。

作为 tableView:willDisplayCell:forRowAtIndexPath: 的文档:状态:委托返回后,表视图仅设置 alpha 和 frame 属性,然后仅在行滑入或滑出时设置动画。

最好的策略是继承 UITableViewCell 并在 layoutSubviews 中执行图层调整。

【讨论】:

但如问题所示,将所有 4 个角都四舍五入。这是一个图层调整。 cornerRadius 是 CALayer 在绘制自身时使用的图层属性。但是存储在 mask 属性中的 UIBezierPath 不会在 UIVew 的 setBounds 上调整大小(当表格调整单元格大小时),因此您需要自己更改它。 完美运行。赏金。 我知道我有点晚了,但我的解决方案是将屏蔽代码放在 tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) (im使用 swift)【参考方案2】:

试试这个 sn-p:

CAShapeLayer *shape = [CAShapeLayer layer];
// Create the path (with only the top-left corner rounded)
UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:self.myView.bounds.bounds 
                                               byRoundingCorners:byRoundingCorners:UIRectCornerBottomLeft|UIRectCornerBottomRight
                                                     cornerRadii:CGSizeMake(5.0f, 5.0f)];

shape.frame = self.myView.bounds;
shape.path = maskPath.CGPath;

// Set the newly created shape layer as the mask for the image view's layer
self.myView.layer.mask = shape;

与 CALayer renderInContext 方法结合使用时,图层蒙版将不会呈现。如果您需要使用此功能,请尝试使用以下圆角:Just two rounded corners?。

【讨论】:

没有变化。只有左边的角落。【参考方案3】:

添加[self.myView layoutIfNeeded];

例子:

[self.myView layoutIfNeeded];

CAShapeLayer *shape = [[CAShapeLayer alloc] init];
shape.path = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(0, 0, self.myView.bounds.size.width, self.myView.bounds.size.height)
                                   byRoundingCorners:UIRectCornerBottomLeft | UIRectCornerBottomRight
                                         cornerRadii:CGSizeMake(5.0f, 5.0f)].CGPath;
self.myView.layer.mask = shape;
self.myView.layer.masksToBounds = YES;

【讨论】:

【参考方案4】:

尝试添加这个

shape.path = [UIBezierPath bezierPathWithRoundedRect:self.myView.bounds
                                   byRoundingCorners:UIRectCornerBottomRight
                                         cornerRadii:CGSizeMake(5.0f, 5.0f)].CGPath;

还有这个

shape.frame = self.myView.bounds; //Right before setting your self.mView.layer.mask = shape;

【讨论】:

没有变化。只有左边的角落。 什么是 myView ?它是 tableCell 中的视图吗?你看这里了吗? ***.com/questions/22410254/… myView 是我要配置的单元格中的视图。我有一个从情节提要到表格视图控制器的出口。贝塞尔代码适用于不在单元格中的视图。 我添加了更多细节和截图。

以上是关于单元格中的 UIView - 不能圆右角的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式删除表格视图单元格中的 UIView?

calayer 没有根据 tableview 单元格中的 UIView 大小而改变

如何将手势识别器添加到collectionview单元格中的uiview

单元格中的破坏约束

在“集合视图”单元格中的UIView上设置渐变背景

当我在收藏视图中滚动时,我的自定义单元格中的 UIView 锚点不断变化