Как найти, находится ли мышь над представлением
Мне нужно найти, находится ли позиция мыши внутри NSView rect.
Я бы использовал NSPointInRect(point, rect)
, но мне нужно было бы преобразовать координаты прямоугольника в координаты экрана, и я не уверен, как это сделать. Любая помощь будет высоко оценена!
Ответы
Ответ 1
Использовать NSView convertPoint: fromView: метод with fromView как ниль для скрытия точки в координатах окна в системе координат вида.
После преобразования точки мыши в систему координат вида я использовал бы мышь NSView: inRect: вместо NSPointInRect, поскольку первая также учитывает перевернутые системы координат.
В качестве альтернативы вы можете использовать Объект области отслеживания.
Ответ 2
Что-то вроде этого должно работать на вас:
NSView* myView; // The view you are converting coordinates to
NSPoint globalLocation = [ NSEvent mouseLocation ];
NSPoint windowLocation = [ [ myView window ] convertScreenToBase: globalLocation ];
NSPoint viewLocation = [ myView convertPoint: windowLocation fromView: nil ];
if( NSPointInRect( viewLocation, [ myView bounds ] ) ) {
// Do your thing here
}
Я не использую это много локальных переменных, но, надеюсь, это сделает этот пример более ясным.
Ответ 3
Некоторое использование кода с помощью мыши: inRect: (рекомендуемый способ, который учитывает перевернутые координаты)
CGPoint point = [self convertPoint:[event locationInWindow] fromView:nil];
CGRect rect = [self bounds];
if ([self mouse:point inRect:rect]) {
}
Ответ 4
Ни один из этих ответов не учитывает, что представление может быть не прямоугольным.
Вот универсальный метод, который работает и с непрямоугольными представлениями. Подумайте о сторожевой поверхности или о сложной форме пути.
Этот фрагмент кода даст вам localPoint из globalPoint (aka globalToLocal). (GlobalPoint в 0,0 оконном пространстве) Если вы измените аргумент на "toView", вы получите точку "localToGlobal".
let localPoint = convertPoint(aPoint, fromView: self.window?.contentView)
Следующий код вернет true или false, если точка находится внутри пути или нет.
CGPathContainsPoint(someCGPath,nil,localPoint,true)
Примечание:
aPoint - глобальная точка, полученная из параметра в hitTest, также может быть получена из:
(self.window?.mouseLocationOutsideOfEventStream)!
Примечание:
Там может быть более правильный способ сделать это. Но это работает и не заботится о просмотренных взглядах.
Ответ 5
Функция NSView isMousePoint работает для меня, не беспокоясь о CG.
func isMouseInView(view: NSView) -> Bool? {
if let window = view.window {
return view.isMousePoint(window.mouseLocationOutsideOfEventStream, in: view.frame)
}
return nil
}