如何强制重绘(drawRect)的子视图时,它会更改尺寸?

我有一个UIView包含UIView的一个子类的行。 子类重写了drawRect :并设置了contentMode = UIViewContentModeRedraw

当用户挤压和拉伸父容器时, child views压扁和拉伸。 随着形状发生变化,我想重复调用drawRect来改变child views的内容。 到目前为止,我一直没有成功。 什么是正确的方法来做到这一点?

干杯,

道格

在Cocoa中,很less(如果曾经)调用drawRect – 只需将区域或视图标记为需要更新,并且它将被安排重绘。 这允许重绘多个失效一起折叠。

对于Cocoa Touch,你需要[view setNeedsDisplay]或setNeedsDisplayinRect:(CGRect)

你需要调用[view setNeedsLayout],如果布局改变,这应该会导致子视图接收一个drawRect:call。 但是我没有testing过这个。

这个解决scheme有点疯狂,但是它是合乎逻辑的,并且有很好的视觉效果。 我正在处理一个NSLayoutManager和一对NSTextContainer ,并在两栏中列出文本。 因为我正在使用多个文本容器(我不知道我想要多个UITextView ),所以我重写了MyDrawingView: UIViewdraw(rect: CGRect)方法。

问题是,使用self.contentMode = .redraw仍然会导致一些小的拉伸旋转 – 足以成为一个交易断路器。

我注意到设置contentMode = .left ,甚至contentMode = .scaleAspectFit是接近我想要的,在像素完美的旋转方面。 但显然,我没有得到我需要的平局。

所以 – 我重写layoutSubviews() ,将contentMode切换到.scaleAspectFit ,称为super.layoutSubviews() ,然后切换回来。 :P

 override func layoutSubviews() { self.contentMode = .scaleAspectFit super.layoutSubviews() self.contentMode = .redraw } 

这十分完美。