#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 . Этот метод вызывается непосредственно перед удалением представления из окна и при освобождении представления.
Я буду ждать кого-то с большим опытом, который сможет найти лучшее решение, которое не противоречит документам. Спасибо