UIView in cell - 不能绕右手角落

时间:2014-11-14 16:12:12

标签: objective-c uitableview uiview ios8 uibezierpath

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

enter image description here

我想配置的视图是浅黄色的。除了确认其他视图没有被剪裁之外,红色视图没有任何实际用途。

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

enter image description here

我在tableView:willDisplayCell:forRowAtIndexPath:

中进行配置

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

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

我得到了这个结果:

enter image description here

所有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;

结果如下:

enter image description here

它对任何一个右角都不起作用。它适用于任何一个左角。

我使用普通视图控制器上的视图对象测试了bezier代码(在表视图之外),代码按预期工作 - 我可以选择性地围绕任何角落。

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

如何在不借助绘图代码的情况下实现这一目标?

4 个答案:

答案 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;