Как узнать, находится ли мышь над видом - PullRequest
18 голосов
/ 08 января 2011

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

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

Ответы [ 5 ]

33 голосов
/ 08 января 2011

Что-то вроде этого должно работать для вас:

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
}

Я лично не использую столько локальных переменных, но, надеюсь, это проиллюстрирует этот пример.

22 голосов
/ 08 января 2011

Используйте NSView's convertPoint: fromView: метод с fromView как nil , чтобы преобразовать точку в координатах окна в систему координат представления.

После преобразования точки мыши в систему координат представления я бы использовал метод NSView mouse: inRect: вместо NSPointInRect, поскольку первый также учитывает перевернутые системы координат.

В качестве альтернативы, вы могли быиспользуйте Объект области слежения .

5 голосов
/ 12 октября 2012

Некоторый код, использующий мышь: inRect: (рекомендуемый способ; учитывает перевернутые координаты)

CGPoint point = [self convertPoint:[event locationInWindow] fromView:nil];
CGRect rect = [self bounds];
if ([self mouse:point inRect:rect]) {
}
2 голосов
/ 13 января 2019

Функция NSView isMousePoint работает для меня, не беспокоясь о CG.

func isMouseInView(view: NSView) -> Bool? {
    if let window = view.window {
        return view.isMousePoint(window.mouseLocationOutsideOfEventStream, in: view.frame)
    }
    return nil
}
1 голос
/ 31 января 2016

Ни один из этих ответов не учитывает, что представление может быть не прямоугольным.

Вот универсальный метод, который работает и на непрямоугольных видах. Подумайте циферблат или сложная форма пути.

Этот фрагмент кода даст вам localPoint из globalPoint (он же globalToLocal). (GlobalPoint в пространстве окна 0,0) Если вы измените аргумент на «toView», то получите точку «localToGlobal».

let localPoint = convertPoint(aPoint, fromView: self.window?.contentView)    

Нижеследующий код вернул бы true или false, если точка находилась внутри пути или нет.

CGPathContainsPoint(someCGPath,nil,localPoint,true)

Примечание: aPoint - это globalPoint, полученный из параметра в hitTest, он также может быть получен из:

(self.window?.mouseLocationOutsideOfEventStream)!

Примечание : Там может быть более правильный способ сделать это. Но это работает и не заботится о перевернутых представлениях.

...