Pergunta

Eu quero encontrar a pressão do toque. Só não sei como realizar esse resultado com o jailbreak e obtendo os dados de toque bruto. Alguém sabe como eu faria isso?

Foi útil?

Solução

Você não pode obter a pressão do SDK nem Métodos sem documentos. No entanto, você posso Detecte o tamanho do toque com métodos sem documentos.


No Gsevent, que é uma representação de nível inferior de Uievent, há uma estrutura conhecida como GSPATHINFO com membros:

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;

Notamos que há um pathPressure e pathMajorRadius. Posso garantir que o membro da pressão é inútil - isso sempre dá 0. No entanto pathMajorRadius contém informações significativas - fornece o raio principal do toque em milímetros. Portanto, você pode dar uma estimativa extremamente aproximada se for um toque pesado ou um toque leve do raio.

  -(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");
  }

Deixe -me avisá -lo novamente, isso é sem documentos E você não deve usá -lo em aplicativos Appstore.


Editar: em 3.2 e acima do pathMajorRadius de um gspathinfo também está disponível como um sem documentos Propriedade em Uitouch:

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

Portanto, o código acima pode ser reescrito usando o Pure 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");
  }

Outras dicas

A partir do iOS 8.0, UITouch tem um público majorRadius propriedade que informa o tamanho aproximado do toque.

No iOS 3.2 e 4.0, você pode obter o valor mais diretamente assim:

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

Ainda não é aprovado pela App Store, mas à mão para coisas personalizadas.

Não é possível com o SDK. Ele não expõe esses dados de qualquer maneira. E a tela não sente pressão, e sequer relata que o tamanho do "tamanho" do sistema operacional é desconhecido. Então, infelizmente, o que você está tentando fazer não é possível em um aplicativo legítimo.

Eu sei porque perguntei a mesma coisa: O iPhone pode detectar o tamanho de um toque?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top