هل هناك أي طريقة على الإطلاق يمكنني معرفة مدى صعوبة الضغط على الشاشة

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

  •  21-09-2019
  •  | 
  •  

سؤال

أريد أن أجد ضغط اللمس. أنا فقط لا أعرف كيفية تحقيق هذه النتيجة دون كسر الحماية والحصول على بيانات اللمس الخام. هل يعرف أحد كيف سأفعل هذا؟

هل كانت مفيدة؟

المحلول

لا يمكنك الحصول على الضغط من SDK ولا طرق غير موثقة. ولكن هل تستطيع اكتشف حجم اللمس مع الأساليب غير الموثقة.


في GSEVENT ، وهو تمثيل من المستوى الأدنى لـ UIVENT ، هناك هيكل معروف باسم 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];

لا يزال غير معتمد من متجر التطبيقات ، ولكن في متناول اليد للأشياء المخصصة.

ليس من الممكن مع SDK. لا يعرض تلك البيانات على أي حال. والشاشة لا تشعر بالضغط ، بل إنها تقارير حتى تقارير "الحجم" إلى نظام التشغيل غير معروف. للأسف ، ما تحاول القيام به غير ممكن في تطبيق شرعي.

أعلم لأنني سألت نفس الشيء: هل يمكن أن يكتشف iPhone حجم اللمسة؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top