¿Hay alguna manera en todo lo que yo puedo decir lo mucho que se está presionando la pantalla

StackOverflow https://stackoverflow.com/questions/2103447

  •  21-09-2019
  •  | 
  •  

Pregunta

Quiero encontrar la presión del toque. Sólo que no sé cómo lograr ese resultado con el jailbreak a cabo y obtener los datos de contacto primas. ¿Alguien sabe cómo me gustaría hacer esto?

¿Fue útil?

Solución

No se puede obtener la presión desde el SDK ni métodos indocumentados. Sin embargo, usted puede detectar el tamaño del contacto con métodos sin papeles.


En el GSEvent, que es una representación de nivel inferior de UIEvent, hay una estructura conocida como GSPathInfo con miembros:

typedef struct GSPathInfo {
    unsigned char pathIndex;        // 0x0 = 0x5C
    unsigned char pathIdentity;     // 0x1 = 0x5D
    unsigned char pathProximity;    // 0x2 = 0x5E
    CGFloat pathPressure;               // 0x4 = 0x60
    CGFloat pathMajorRadius;        // 0x8 = 0x64
    CGPoint pathLocation;           // 0xC = 0x68
    GSWindowRef pathWindow;         // 0x14 = 0x70
} GSPathInfo;

Nos damos cuenta de que hay una pathPressure y pathMajorRadius. Les puedo asegurar que el miembro de presión es inútil - que siempre da 0. Sin embargo pathMajorRadius contiene información significativa - que da la radio mayor del tacto en milímetros. Por lo tanto, se puede dar una estimación extremadamente peligrosa si se trata de un toque pesado o ligero toque de la radio.

  -(void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event {
     GSEventRef gsevent = [event _gsEvent];
     GSPathInfo first_touch = GSEventGetPathInfoAtIndex(gsevent, 0);
     if (first_touch.pathMajorRadius >= 9)
        NSLog(@"huge (heavy) touch");
     else
        NSLog(@"little (light) touch");
  }

Déjeme advertirle de nuevo esto es indocumentado y no se debe usar en aplicaciones AppStore.


Editar: En 3,2 y por encima de la pathMajorRadius de un GSPathInfo también está disponible como un indocumentado en la propiedad UITouch:

@property(assign, nonatomic, setter=_setPathMajorRadius:) CGFloat _pathMajorRadius;

por lo que el código anterior podría reescribirse usando pura Objective-C:

  -(void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event {
     UITouch* any_touch = [touches anyObject];
     if (any_touch._pathMajorRadius >= 9)
        NSLog(@"huge (heavy) touch");
     else
        NSLog(@"little (light) touch");
  }

Otros consejos

Como de Ios 8,0, UITouch tiene una propiedad majorRadius público que le indica el tamaño aproximado de tacto.

En iOS 3.2 y 4.0 se puede obtener el valor más directamente como esto:

UITouch* touch = ...// get the touch object
float radius = [[touch valueForKey:@"pathMajorRadius"] floatValue];

Aún no se ha aprobado la App Store, pero es práctico para la materia personalizada.

No es posible con el SDK. No expone que los datos de todos modos. Y la pantalla no hace presión sentido, y aún wether informa toque "tamaño" que el sistema operativo es desconocido. Así que, lamentablemente, lo que está tratando de hacer no es posible en una aplicación de fiar.

Lo sé porque lo hice la misma cosa: ¿Puede el iPhone detectar el tamaño de un toque?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top