如何更改尺寸时,如何强制重绘(drawRect)SubView?
-
10-07-2019 - |
题
我有一个包含一行UIView
子类的UIView。子类已重写drawRect
:并已设置contentMode = UIViewContentModeRedraw
。
当用户挤压并拉伸父容器时,child views
挤压并伸展。当形状发生变化时,我希望反复调用<=>来更改<=>的内容。到目前为止,我一直没有成功。这样做的正确方法是什么?
干杯,
道格
解决方案
在Cocoa中,你很少(如果有的话)调用drawRect - 你只需将区域或视图标记为需要更新,它将被安排进行重绘。这允许将多个失效的重绘折叠在一起。
对于Cocoa Touch,您需要 [view setNeedsDisplay] 或 setNeedsDisplayinRect:(CGRect)
其他提示
您需要调用[view setNeedsLayout],这会导致子视图在布局更改时接收drawRect:call。但是,我没有测试过这个。
这个解决方案有点疯狂,但它具有逻辑意义,并且具有很好的视觉效果。我正在使用NSLayoutManager
和几个NSTextContainer
s,在两列中列出文本。因为我使用多个文本容器(我不确定我想要多个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
}
这是......完美。