如何强制重绘(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: UIView
的draw(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 }
这十分完美。