我有一个包含一行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
}

这是......完美。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top