我有一个包含的子类的一排一个UIView UIView
。 子类已重写drawRect
:并先后成立contentMode = UIViewContentModeRedraw
。
当用户南瓜和伸展父容器child views
挤压和拉伸。 由于形状发生变化,我想拥有drawRect
多次呼吁改变的内容child views
。 到目前为止,我都没有成功。 什么是这样做的正确方法?
干杯,
道格
我有一个包含的子类的一排一个UIView UIView
。 子类已重写drawRect
:并先后成立contentMode = UIViewContentModeRedraw
。
当用户南瓜和伸展父容器child views
挤压和拉伸。 由于形状发生变化,我想拥有drawRect
多次呼吁改变的内容child views
。 到目前为止,我都没有成功。 什么是这样做的正确方法?
干杯,
道格
在可可,你很少(如果有的话)调用的drawRect - 你只是标示的区域或视图需要更新,并会定期重绘。 这允许多个废票重绘可以收拢在一起。
对于可可触摸,你想要么[查看setNeedsDisplay] ,或setNeedsDisplayinRect:(的CGRect)
你需要调用[查看setNeedsLayout],这一点应引起子视图接收的drawRect:如果打电话的布局变化。 我还没有测试但此。
该解决方案是一个有点疯狂,但它具有逻辑意义,并拥有绝佳的视觉效果。 我有一个工作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
}
这十分完美。