在UITableViewCell的子视图上设置遮罩层将覆盖自动布局约束

我有一个具有多个子视图的UITableViewCell 。 其中一个子视图是UILabel ,根据UILabel本的大小dynamic调整单元格的高度。 这完美的作品。

我有另一个子视图,也有约束的单元格。 这个子视图总是应该和单元具有完全相同的高度。 这个效果也很好。

但是,当我尝试在子视图上设置遮罩层时遇到了问题。 蒙版图层正常工作,但是子视图的高度是错误的,与单元格的高度不一样。

这是我的面具层代码:

 UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:self.mySubview.bounds byRoundingCorners:(UIRectCornerTopLeft | UIRectCornerTopRight | UIRectCornerBottomLeft | UIRectCornerBottomRight) cornerRadii:CGSizeMake(10, 10)]; CAShapeLayer *maskLayer = [CAShapeLayer layer]; maskLayer.frame = self.mySubview.bounds; maskLayer.path = maskPath.CGPath; self.mySubview.layer.mask = maskLayer; 

我一直在做研究,并试图find一种方法来解决这个问题,所以我可以设置遮罩层,并让子视图有正确的高度,但我一直无法得到它的工作。

我现在已经看过这个解决scheme多次推荐了:

 [self setNeedLayout]; [self layoutIfNeeded]; // Customize cell after here 

但是这对我也不适用。 有没有办法让我知道什么时候自动布局约束已经被应用,以便我可以在之后应用遮罩层?

遮罩层代码非常简单,它使用子视图的边界,并且边界是closures的,因为它使用了约束已经应用之前存在的边界,并且子视图具有正确的高度。 至less我觉得我是正确的理解。

我终于明白了 我不知道这是否是正确的地方,或者如果这可能会导致性能问题,但到目前为止,它是完美的:

 - (void)drawRect:(CGRect)rect { [super drawRect:rect]; UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:self.mySubview.bounds byRoundingCorners:(UIRectCornerTopLeft | UIRectCornerTopRight | UIRectCornerBottomLeft | UIRectCornerBottomRight) cornerRadii:CGSizeMake(10, 10)]; CAShapeLayer *maskLayer = [CAShapeLayer layer]; maskLayer.frame = self.mySubview.bounds; maskLayer.path = maskPath.CGPath; self.mySubview.layer.mask = maskLayer; } 

我不得不重写drawRect:在我的UITableViewCell子类中,并在那里设置遮罩层。

我有同样的问题,并在- (void)drawRect:(CGRect)rect做的工作,但它可能是昂贵的性能方面。

您可以在执行select器中调用剪裁或阴影方法

 [self performSelector:@selector(<your drawing method>) withObject:nil afterDelay:0.0000001 ];//a very low delay