【问题标题】:Setting mask layer on UITableViewCell's subview overrides Auto Layout constraints在 UITableViewCell 的子视图上设置遮罩层会覆盖自动布局约束
【发布时间】:2015-06-20 15:29:44
【问题描述】:

我有一个带有多个子视图的UITableViewCell。其中一个子视图是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;

我一直在研究并试图找到解决此问题的方法,这样我就可以设置遮罩层并让子视图具有正确的高度,但我无法让它工作。

我已经多次看到这个解决方案被推荐了:

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

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

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

【问题讨论】:

  • 你试过在viewDidLayoutSubviews中应用它吗?或viewDidAppear?
  • @sansof 我会在里面做什么?抓住当前可见的单元格并应用蒙版?
  • 为遮罩层边界创建 ivar,并将其设置为子视图的边界?这个问题有用吗? stackoverflow.com/questions/12527191/…
  • @sansof 我愿意尝试这个,但我需要更多细节。你能提交答案吗?
  • 我不确定我是否理解您的问题...您在哪里设置遮罩层代码?

标签: ios objective-c uitableview autolayout calayer


【解决方案1】:

我终于明白了。我不确定这是否是放置它的正确位置,或者它是否可能导致性能问题,但到目前为止它运行良好:

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

}

我必须在我的 UITableViewCell 子类中覆盖 drawRect: 并在那里设置遮罩层。

【讨论】:

  • 非常感谢。您节省了我很多时间。
【解决方案2】:

我也遇到过同样的问题,在 - (void)drawRect:(CGRect)rect 中做的事情确实有效,但在性能方面可能代价高昂。

您可以在执行选择器中调用您的剪辑或阴影方法

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-18
    • 2018-10-16
    • 1970-01-01
    • 1970-01-01
    • 2012-10-30
    相关资源
    最近更新 更多