Domanda

Voglio trovare la pressione del tocco. Io proprio non so come realizzare questo risultato con fuori jailbreaking esso e ottenere i dati grezzi tocco. Qualcuno sa come posso fare questo?

È stato utile?

Soluzione

Non si può ottenere la pressione dal SDK non metodi non documentati. Tuttavia si possono di rilevare la dimensione del contatto con metodi non documentati.


Nel GSEvent, che è una rappresentazione di livello inferiore di UIEvent, v'è una struttura nota come GSPathInfo con i membri:

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;

Abbiamo notato che c'è una pathPressure e pathMajorRadius. Vi posso assicurare il membro pressione è inutile - è sempre dà 0. Tuttavia pathMajorRadius contiene informazioni significative - dà il raggio maggiore del tocco in millimetri. Si può quindi dare una stima estremamente pericolosa se si tratta di un tocco pesante o leggero tocco dal raggio.

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

Mi permetta di mettere in guardia ancora una volta questo è non documentato e non si deve utilizzare in applicazioni di AppStore.


Modifica: Il 3.2 e al di sopra della pathMajorRadius di un GSPathInfo è disponibile anche come non documentato proprietà in UITouch:

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

in modo che il codice di cui sopra potrebbe essere riscritto utilizzando puro 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");
  }

Altri suggerimenti

A partire da iOS 8.0, UITouch ha una proprietà majorRadius pubblico che ti dice la dimensione approssimativa del tocco.

In iOS 3.2 e 4.0 si può ottenere il valore più direttamente in questo modo:

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

Ancora non non è approvato App Store, ma a portata di mano per la roba personalizzato.

Non è possibile con l'SDK. Essa non espone i dati in ogni caso. E lo schermo non rileva la pressione, e castrato riporta anche toccare "size" per il sistema operativo è sconosciuta. Così, purtroppo, ciò che si sta cercando di fare non è possibile su una domanda legittima.

Lo so perché ho chiesto la stessa cosa: Può il iPhone rilevare le dimensioni di un contatto?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top