Есть ли вообще способ показать, насколько сильно экран нажат

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

Ответы

Ответ 1

Вы не можете получить давление от 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");
  }

Ответ 2

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

Ответ 3

В iOS 3.2 и 4.0 вы можете получить значение более прямо следующим образом:

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

Тем не менее App Store одобрен, но удобен для пользовательских материалов.

Ответ 4

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

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