Есть ли способ узнать, насколько сильно нажимается экран?
Вопрос
Я хочу найти давление прикосновения.Я просто не знаю, как добиться этого результата, не взломав его и не получив необработанные данные касания.Кто-нибудь знает, как бы я это сделал?
Решение
Вы не можете получить давление со стороны 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");
}
Другие советы
Начиная с iOS 8.0, UITouch
имеет общественность majorRadius
свойство, которое сообщает вам приблизительный размер касания.
В iOS 3.2 и 4.0 вы можете получить значение более напрямую следующим образом:
UITouch* touch = ...// get the touch object
float radius = [[touch valueForKey:@"pathMajorRadius"] floatValue];
Все еще не одобрен App Store, но удобен для нестандартных вещей.
С SDK это невозможно.В любом случае он не раскрывает эти данные.И экран не ощущает давления, и неизвестно, сообщает ли он вообще о «размере» касания ОС.К сожалению, то, что вы пытаетесь сделать, невозможно в законном приложении.
Я знаю, потому что я спросил то же самое: Может ли iPhone определить размер касания?