Ответ 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");
}