Есть ли способ узнать, насколько сильно нажимается экран?

StackOverflow https://stackoverflow.com/questions/2103447

  •  21-09-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

Вы не можете получить давление со стороны 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 определить размер касания?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top