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