needsDisplay触发无限的drawRect循环

时间:2014-07-22 06:13:00

标签: cocoa events swift nsview

Whole app for context

似乎在此mouseUp处理程序中设置needsDisplay时,触发了一个永无止境的绘图级联,我不知道为什么......

所需的效果是,mouseUp更改按钮的mode属性后,当drawRect发生时,按钮的图标只会从the red circlethe black square 没有上面的gif中显示的级联图。

我已将它缩小了一点,可以说原因是the rect.origin.x being passed to MainView's drawRect function逐渐变大,宽度变小,但我无法弄明白为什么那是。

1 个答案:

答案 0 :(得分:1)

事实证明这种情况正在发生,因为我正在为子视图分配新帧以尝试正确计算调整大小...这触发了绘制循环,因为我正在计算并在drawRect内分配它们。 / p>

原来有一个覆盖来专门处理视图调整大小事件。

resizeSubviewsWithOldSize:

更改相关代码,例如

override func drawRect(rect: NSRect) {
    super.drawRect(rect)
    NSColor(calibratedWhite: 0.1, alpha: 1).setFill()
    NSRectFill(rect)

    let mbFrame = NSMakeRect(
        rect.size.width / 2 - (45 / 2),
        8,
        49,
        49
    )
    mainBtn.frame = mbFrame
}

override func resizeSubviewsWithOldSize(oldSize: NSSize) {
    let mbFrame = NSMakeRect(
        self.frame.size.width / 2 - (45 / 2),
        8,
        49,
        49
    )
    mainBtn.frame = mbFrame
}

override func drawRect(rect: NSRect) {
    super.drawRect(rect)
    NSColor(calibratedWhite: 0.1, alpha: 1).setFill()
    NSRectFill(rect)
}

让一切都玩得很好。