如何更改尺寸时,如何强制重绘(drawRect)SubView?

时间:2009-09-17 23:04:57

标签: ios objective-c iphone uiview uikit

我有一个UIView,它包含一行UIView的子类。子类已覆盖drawRect:并已设置contentMode = UIViewContentModeRedraw

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

干杯,

道格

3 个答案:

答案 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
}

这是......完美。