我在静态表格视图单元格中有一个矩形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;
结果如下:
它对任何一个右角都不起作用。它适用于任何一个左角。
我使用普通视图控制器上的视图对象测试了bezier代码(在表视图之外),代码按预期工作 - 我可以选择性地围绕任何角落。
为什么它不能在表格视图单元格中工作?
如何在不借助绘图代码的情况下实现这一目标?
答案 0 :(得分:1)
尝试使用此代码段:
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?。
答案 1 :(得分:1)
我认为这是因为你的视图的框架,因此在制作图层蒙版后边界会发生变化。
作为tableView的文档:willDisplayCell:forRowAtIndexPath:states:委托返回后,表视图仅设置alpha和frame属性,然后仅在向行或滑出时为行设置动画。
最好的策略是继承UITableViewCell并在layoutSubviews中执行图层调整。
答案 2 :(得分:1)
添加[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;
答案 3 :(得分:0)
尝试添加此
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;