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

use*_*977 3 objective-c uitableview calayer ios autolayout

我有一个UITableViewCell多个子视图.其中一个子视图是a UILabel,单元格的高度是根据文本的大小动态调整的UILabel.这非常有效.

我在单元格中有另一个子视图也有约束.该子视图始终应与单元格具有完全相同的高度.这也非常有效.

但是,在尝试在该子视图上设置遮罩层时遇到问题.遮罩层正常工作,但子视图的高度错误,并且与单元格的高度不同.

这是我的掩码层代码:

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;
Run Code Online (Sandbox Code Playgroud)

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

我已经看过几次推荐这个解决方案了:

[self setNeedLayout];
[self layoutIfNeeded];
// Customize cell after here
Run Code Online (Sandbox Code Playgroud)

但这对我也不起作用.有没有办法让我知道何时应用了自动布局约束,以便我可以在之后应用遮罩层?

掩码层代码非常简单,它使用子视图的边界,并且边界是关闭的,因为它使用了在应用约束之前存在的边界并且子视图具有正确的高度.至少我认为我理解正确.

use*_*977 19

我终于明白了.我不确定这是否是放置它的正确位置,或者它是否可能导致性能问题,但到目前为止它完美地工作:

- (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;

}
Run Code Online (Sandbox Code Playgroud)

我不得不drawRect:在我的UITableViewCell子类中重写并在那里设置掩码层.