Можно ли вообще сказать, как сильно нажимается экран? - PullRequest
13 голосов
/ 20 января 2010

Я хочу найти давление прикосновения. Я просто не знаю, как добиться этого результата без джейлбрейка и получения сырых сенсорных данных Кто-нибудь знает, как бы я это сделал?

Ответы [ 4 ]

28 голосов
/ 20 января 2010

Вы не можете получить давление от недокументированных методов SDK или . Однако вы можете определить размер касания недокументированными методами.


В GSEvent, который является представлением UIEvent более низкого уровня, есть структура, известная как GSPathInfo с членами:

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;

Мы замечаем, что есть pathPressure и pathMajorRadius. Я могу заверить вас, что нажимной элемент бесполезен - он всегда дает 0. Однако pathMajorRadius содержит значимую информацию - он дает основной радиус касания в миллиметрах. Поэтому вы можете дать очень грубую оценку, если это сильное касание или легкое касание с радиуса.

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

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


Редактировать: На 3.2 и выше pathMajorRadius GSPathInfo также доступно как недокументированное свойство в UITouch:

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

поэтому приведенный выше код можно переписать с использованием чистого 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");
  }
13 голосов
/ 25 августа 2014

Начиная с iOS 8.0, UITouch имеет открытое свойство majorRadius, которое сообщает приблизительный размер касания.

12 голосов
/ 09 июля 2010

В iOS 3.2 и 4.0 вы можете получить значение более прямо, как это:

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

Все еще не одобрен App Store, но удобно для нестандартных вещей.

1 голос
/ 20 января 2010

С SDK это невозможно. Это не раскрывает эти данные в любом случае. Причем экран не ощущает давления, а о том, сообщает ли ему сенсорный «размер» ОС, неизвестно. К сожалению, то, что вы пытаетесь сделать, невозможно на законном заявлении.

Я знаю, потому что я спросил то же самое: Может ли iPhone определить размер касания?

...