【问题标题】:Redraw / setNeedsLayout of UIScrollView subview does not workUIScrollView 子视图的重绘/setNeedsLayout 不起作用
【发布时间】:2019-08-02 20:35:01
【问题描述】:

我创建了一个简单的自定义UIView 子类LineView,它覆盖drawRect: 以从右上角到左下角画一条线。

这个LineView 作为子视图放置在UIScrollView 中,对其高度和宽度使用固定约束,对其位置使用顶部+前导约束。

UIScrollView 滚动时,宽度约束会更新为更改线视图的大小:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    ...
    self.lineViewWidthConstraint.constant = someFactorRelatedToTheCurrentScrollPosition;
    [self.lineView setNeedsLayout];
}

问题:改变宽度不会调用LineView的drawRect:方法。因此,这条线不会被重新绘制,而只是被挤压或拉伸。即使手动使用setNeedsLayout 也不会触发重绘。

知道为什么不调用 draw 方法以及如何解决这个问题吗?

【问题讨论】:

  • 将您的代码从“drawRect”方法移动到“layoutSubviews”方法
  • 感谢@iDhaval,但我如何在 layoutSubviews 中执行绘图?
  • 最终,绘制是在图层上完成的。因此,您可以使用 CAShapeLayer 和 UIBezierPath 绘制线条。关注这个:stackoverflow.com/questions/21311880/…
  • 试试setNeedsLayout,而不是setNeedsDisplay
  • 谢谢,添加 CALayer 并手动更新它可以正常工作并解决问题。

标签: ios uiview uiscrollview


【解决方案1】:

尝试使用layoutIfNeeded 而不是setNeedsLayout。因为前者是同步(强制)调用,后者是异步调用。

【讨论】:

  • 谢谢,结果还是一样。
  • @AndreiHerford 尝试在滚动视图实例或您的超级视图实例上使用 layoutIfNeeded。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-17
  • 1970-01-01
  • 2012-02-05
  • 1970-01-01
  • 1970-01-01
  • 2010-12-23
相关资源
最近更新 更多