Возможно ли в NSSplitView временно отключить изменение курсора мыши при наведении курсора на разделитель?

#swift #cocoa #nssplitview

#swift #какао #nssplitview

Вопрос:

Я разрабатываю приложение для macOS, и у меня есть подкласс NSSplitView, который я когда-нибудь полностью отключу, уменьшив его буквенное значение, поскольку в подклассе происходит следующее:

 override func hitTest(_ point: NSPoint) -> NSView? {
    if self.alphaValue == 1.0 {
        return super.hitTest(point)
    }    
    return nil
}
  

Я знаю, что это всего лишь деталь, но, тем не менее, я хотел бы ее решить. SplitView корректно игнорирует щелчки мыши из-за переопределенного метода, но когда мышь переходит в разделитель, курсор должным образом изменяется, чтобы отразить это, и отображает курсор перемещения разделителя. Могу ли я временно предотвратить это? это очень незначительная вещь, но на данный момент мне тоже любопытно. Спасибо за любую помощь.

Ответ №1:

Из документации resetCursorRects:

Переопределяется подклассами для определения их прямоугольников курсора по умолчанию.

Реализация подкласса должна вызывать addCursorRect(_:cursor:) для каждого прямоугольника курсора, который он хочет установить. Реализация по умолчанию ничего не делает.

Код приложения никогда не должен вызывать этот метод напрямую; он вызывается автоматически, как описано в разделе «Реагирование на события и действия пользователя». Вместо этого используйте метод invalidateCursorRects(for:), чтобы явно перестроить прямоугольники курсора.

Запретить разделенному виду определять его прямоугольники курсора, если он отключен:

 override func resetCursorRects() {
    if self.alphaValue == 1.0 {
        super.resetCursorRects()
    }    
}
  

Перестройте прямоугольники курсора, когда разделенный вид включен и отключен, например:

 func enable() {
    self.alphaValue = 1.0
    self.window?.invalidateCursorRects(for:self)
}

func disable() {
    self.alphaValue = 0.5
    self.window?.invalidateCursorRects(for:self)
}
  

Ответ №2:

Я нашел способ, который работает. Я изменил переопределение hitTest таким образом:

 override func hitTest(_ point: NSPoint) -> NSView? {
    if self.alphaValue == 1.0 {
        self.resetCursorRects()
        return super.hitTest(point)
    }
    self.discardCursorRects()
    return nil
}
  

Он больше не показывает изменение курсора. Но документы рекомендуют не делать этого:

  • (void)discardCursorRects; Вам никогда не нужно вызывать этот метод напрямую; он также обычно не вызывается во время аннулирования прямоугольников курсора. NSWindow автоматически аннулирует прямоугольники курсора в ответ на invalidateCursorRectsForView: и перед тем, как прямоугольники курсора представления будут восстановлены с помощью resetCursorRects . Этот метод вызывается непосредственно перед удалением представления из окна и при освобождении представления.

Я буду ждать кого-то с большим опытом, который сможет найти лучшее решение, которое не противоречит документам. Спасибо