Подтвердить что ты не робот

Как найти, находится ли мышь над представлением

Мне нужно найти, находится ли позиция мыши внутри NSView rect.

Я бы использовал NSPointInRect(point, rect), но мне нужно было бы преобразовать координаты прямоугольника в координаты экрана, и я не уверен, как это сделать. Любая помощь будет высоко оценена!

4b9b3361

Ответ 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
}