【问题标题】:How Do I Force Redrawing (drawRect) of a SubView When it Changes Dimensions?更改尺寸时如何强制重绘 (drawRect) 子视图?
【发布时间】:2010-11-29 07:56:24
【问题描述】:

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

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

干杯,

道格

【问题讨论】:

    标签: ios objective-c iphone uiview uikit


    【解决方案1】:

    在 Cocoa 中,您很少(如果有的话)调用 drawRect - 您只需将区域或视图标记为需要更新,它就会被安排重新绘制。这允许将多个失效的重绘折叠在一起。

    对于 Cocoa Touch,您需要 [view setNeedsDisplay]setNeedsDisplayinRect:(CGRect)

    【讨论】:

    • 我尝试过这样做。没有效果。努廷。在子类中,我覆盖了 setTransform: 方法: - (void)setTransform:(CGAffineTransform)newValue { [super setTransform:newValue]; [自我设置需求显示]; }
    • 显然,我的一些代码现在已经正确触发了 setNeedsDisplay。
    【解决方案2】:

    您需要调用 [view setNeedsLayout],如果布局发生变化,这应该会导致子视图接收到 drawRect: 调用。不过,我还没有测试过。

    【讨论】:

    • 有人说setNeedsDisplay,有人说setNeedsLayout..这里有什么不同的含义?
    【解决方案3】:

    这个解决方案有点疯狂,但它合乎逻辑,并且具有出色的视觉效果。我正在与NSLayoutManager 和一对NSTextContainers 合作,在两列中布置文本。因为我正在使用多个文本容器(并且我不确定是否需要多个 UITextView),所以我将覆盖 MyDrawingView: UIViewdraw(rect: CGRect) 方法。

    问题在于,使用self.contentMode = .redraw 仍然会导致轮换出现一些轻微的拉伸——足以破坏交易。

    我注意到设置contentMode = .left,甚至contentMode = .scaleAspectFit 接近我想要的,就像素完美旋转而言。但很明显,我没有得到我需要的draw call。

    所以--我覆盖了layoutSubviews(),将contentMode 切换为.scaleAspectFit,调用super.layoutSubviews(),然后又将其切换回来。 :P

    override func layoutSubviews() {
        self.contentMode = .scaleAspectFit
    
        super.layoutSubviews()
        self.contentMode = .redraw
    }
    

    这是……完美的。

    【讨论】:

      猜你喜欢
      • 2016-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-31
      • 2017-03-15
      • 2021-10-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多