objective c - superponer - Cómo encontrar si el mouse está sobre una vista.
superponer graficas en r (5)
Algo como esto debería funcionar para usted:
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
}
Personalmente no uso tantas variables locales, pero espero que esto aclare este ejemplo.
Necesito encontrar si la posición del mouse está dentro de un rect de NSView.
NSPointInRect(point, rect)
, pero necesitaría convertir las coordenadas rect en coordenadas de pantalla y no estoy seguro de cómo hacerlo. Cualquier ayuda sería muy apreciada!
Algunos códigos hacen uso del mouse: inRect: (la forma recomendada; eso explica las coordenadas volteadas)
CGPoint point = [self convertPoint:[event locationInWindow] fromView:nil];
CGRect rect = [self bounds];
if ([self mouse:point inRect:rect]) {
}
La función NSView isMousePoint funciona para mí, sin tener que preocuparme por nada de CG.
func isMouseInView(view: NSView) -> Bool? {
if let window = view.window {
return view.isMousePoint(window.mouseLocationOutsideOfEventStream, in: view.frame)
}
return nil
}
Use el método convertPoint: fromView: de NSView con fromView como nil para convertir un punto en las coordenadas de la ventana al sistema de coordenadas de una vista.
Después de convertir el punto del mouse en el sistema de coordenadas de la vista, utilizaría el mouse de NSView: inRect: method en lugar de NSPointInRect, ya que el primero también tiene en cuenta los sistemas de coordenadas invertidos.
Alternativamente, puede utilizar un objeto de área de seguimiento .
Ninguna de estas respuestas tiene en cuenta que una vista puede no ser rectangular.
Aquí hay un método universal que también funciona en vistas no rectangulares. Piense en la esfera del reloj o en una forma de camino complejo.
Este fragmento de código le dará un localPoint de un globalPoint (también conocido como globalToLocal). (GlobalPoint en el espacio de la ventana 0,0) Si cambia el argumento a "toView", obtiene un punto "localToGlobal".
let localPoint = convertPoint(aPoint, fromView: self.window?.contentView)
El código de abajo devolvería verdadero o falso si el punto estaba dentro de la ruta o no.
CGPathContainsPoint(someCGPath,nil,localPoint,true)
NOTA: aPoint es un globalPoint derivado del parámetro en hitTest, también puede derivarse de:
(self.window?.mouseLocationOutsideOfEventStream)!
NOTA : Puede haber una forma más correcta de hacer esto. Pero esto funciona, y no se preocupa por las vistas invertidas.