单元格中的 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 - 不能圆右角的主要内容,如果未能解决你的问题,请参考以下文章
calayer 没有根据 tableview 单元格中的 UIView 大小而改变