我有一个UIView,它包含一行UIView
的子类。子类已覆盖drawRect
:并已设置contentMode = UIViewContentModeRedraw
。
当用户压扁并拉伸父容器时,child views
挤压并伸展。随着形状发生变化,我希望重复调用drawRect
来更改child views
的内容。到目前为止,我一直没有成功。这样做的正确方法是什么?
干杯,
道格
答案 0 :(得分:58)
在Cocoa中,你很少(如果有的话)调用drawRect - 你只需将区域或视图标记为需要更新,它将被安排进行重绘。这允许将多个失效的重绘折叠在一起。
对于Cocoa Touch,您需要[view setNeedsDisplay]或setNeedsDisplayinRect:(CGRect)
答案 1 :(得分:3)
您需要调用[view setNeedsLayout],这会导致子视图在布局更改时接收drawRect:call。但是,我没有测试过这个。
答案 2 :(得分:0)
这个解决方案有点疯狂,但它具有逻辑意义,并且具有很好的视觉效果。我正在使用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
}
这是......完美。