在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
- 在Swift 3中以编程方式使用ScrollView
- iOS滚动视图,容器视图 – 自动布局问题
- 如何在animateTransition期间获取ToViewController中子视图的框架:?
- 带有AutoLayout错误标题的UISegmentedControl
- 如何在UIScrollView中将UIImage视图缩放为一个带有Autolay的正方形
- Xcode 5自动布局 – embedded表
- 如何使用自动布局以编程方式将活动指标定位到其超级视图的中心?
- 所有这些自动布局更新方法有什么区别? 都需要吗?
- 使用“自动布局”,如何使同一“行”上的两个标签在宽度上dynamic变化(根据每个标签的宽度进行调整)?