如何子视图做我力重绘(drawRect中),当它改变尺寸?(How Do I Force Redra

2019-08-07 12:01发布

我有一个包含的子类的一排一个UIView UIView 。 子类已重写drawRect :并先后成立contentMode = UIViewContentModeRedraw

当用户南瓜和伸展父容器child views挤压和拉伸。 由于形状发生变化,我想拥有drawRect多次呼吁改变的内容child views 。 到目前为止,我都没有成功。 什么是这样做的正确方法?

干杯,

道格

Answer 1:

在可可,你很少(如果有的话)调用的drawRect - 你只是标示的区域或视图需要更新,并会定期重绘。 这允许多个废票重绘可以收拢在一起。

对于可可触摸,你想要么[查看setNeedsDisplay] ,或setNeedsDisplayinRect:(的CGRect)



Answer 2:

你需要调用[查看setNeedsLayout],这一点应引起子视图接收的drawRect:如果打电话的布局变化。 我还没有测试但此。



Answer 3:

该解决方案是一个有点疯狂,但它具有逻辑意义,并拥有绝佳的视觉效果。 我有一个工作NSLayoutManager和一对夫妇NSTextContainer秒,在两列布置文本。 因为我使用的多个文本容器(我不知道我要多UITextView ),我重写draw(rect: CGRect)的方法MyDrawingView: UIView

问题是,使用self.contentMode = .redraw仍然导致一些轻微的拉伸上旋转-足以显著是一个致命弱点。

我注意到,设置contentMode = .left ,甚至contentMode = .scaleAspectFit接近我想要的东西,在像素完美旋转项。 但很明显,我没有得到绘图调用我需要的。

所以-我推翻layoutSubviews()切换contentMode.scaleAspectFit ,叫super.layoutSubviews()然后再切换回来。 :P

override func layoutSubviews() {
    self.contentMode = .scaleAspectFit

    super.layoutSubviews()
    self.contentMode = .redraw
}

这十分完美。



文章来源: How Do I Force Redrawing (drawRect) of a SubView When it Changes Dimensions?