【问题标题】:View drawRect only called after delayView drawRect 仅在延迟后调用
【发布时间】:2016-11-23 12:26:38
【问题描述】:

我创建了一个实现自定义绘图的UIView 子类。这是代码(请不要介意这可以通过UIImageView 来完成。我剥离了所有额外的代码只是为了显示问题)

@IBDesignable
class TPMSkinnedImageView: UIView {
    private var originalImage:UIImage?
    private var skinnedImage:UIImage?

    @IBInspectable var image: UIImage? {
        set {
            originalImage = newValue

            if(newValue == nil) {
                skinnedImage = nil
                return
            }

            skinnedImage = originalImage!

            self.invalidateIntrinsicContentSize()
            self.setNeedsDisplay()
        }

        get {
            return originalImage
        }
    }

    override func draw(_ rect: CGRect) {
        let context:CGContext! = UIGraphicsGetCurrentContext()
        context.saveGState()
        context.translateBy(x: 0, y: rect.height)
        context.scaleBy(x: 1, y: -1)
        context.draw(skinnedImage!.cgImage!, in: rect)
        context.restoreGState()
    }

    override var intrinsicContentSize: CGSize {
        if(skinnedImage != nil) {
            return skinnedImage!.size
        }

        return CGSize.zero
    }
}

我在视图控制器 nib 文件中实例化此视图并以模态方式显示视图控制器。

发生的情况是 draw 方法仅在父视图在屏幕上显示大约 20 秒时才被调用。

我检查了intrinsicContentSize,它没有返回.zero

这就是堆栈调用后的样子:

知道是什么原因造成的吗?

【问题讨论】:

    标签: ios uiview uikit


    【解决方案1】:

    尝试在视图控制器的 viewWillAppear() 中调用 setNeedsDisplay()

    【讨论】:

    • 我在子视图本身上调用它并且它有效。但我不明白我为什么要这样做。通常我的视图不应该知道存在带有自定义绘图代码的子视图这一事实。我认为,它应该在视图显示时至少绘制一次。
    • 不确定。在你的 draw 方法中设置一个断点,看看它什么时候被调用。查看堆栈跟踪以了解调用它的位置。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-06
    • 1970-01-01
    • 2018-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-06
    相关资源
    最近更新 更多