هل هناك علامة برنامج التحويل البرمجي Xcode محددة يتم تعيينها عند التجميع لجهاز iPad؟

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

  •  23-09-2019
  •  | 
  •  

سؤال

هل هناك علامة برنامج التحويل البرمجي Xcode محددة يتم تعيينها عند التجميع لجهاز iPad؟

أرغب في تجميع رمز iPad مقابل iPhone/iPod touch بشرط على سبيل المثال:

#ifdef TARGET_IPAD
   code for iPad
#else
   code for iPhone
#endif

أعلم أن هناك بالفعل Target_os_iphone و target_cpu_arm في TargetConditionals.h ولكن أي شيء يسهل على وجه التحديد يستهدف iPad؟

-rei

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

المحلول

واجهة برمجة التطبيقات الصحيحة التي يجب استخدامها للتحقق من وقت التشغيل من iPad مقابل iPhone/iPad Touch هي:

BOOL deviceIsPad = ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad);

يتضمن Filer uidevice Header أيضًا ماكرو مناسب ، UI_USER_INTERFACE_IDIOM () ، والذي سيكون مفيدًا إذا كان هدف النشر الخاص بك هو <iPhone 3.2.

#define UI_USER_INTERFACE_IDIOM() ([[UIDevice currentDevice] respondsToSelector:@selector(userInterfaceIdiom)] ? [[UIDevice currentDevice] userInterfaceIdiom] : UIUserInterfaceIdiomPhone)

لذلك يمكنك فقط أن تقول ، سلبا:

BOOL deviceIsPad = (UI_USER_INTERFACE_IDIOM() != UIUserInterfaceIdiomPhone);

نصائح أخرى

بدلاً من استخدام أعلام وقت الترجمة ، يجب عليك استخدام وقت التشغيل على سبيل المثال الاستخدام NSClassFromString لمعرفة ما إذا كان هناك فئة لأنه يمكن تثبيت التطبيق نفسه على كلا الجهازين.

وبسبب إمكانية تشغيل التطبيق في كلا الجهازين ، لا يوجد فحص مدمج وقت الترجمة سواء كان يستهدف iPad أم لا.

في الوقت الحالي ، لم أجد أي شيء يتيح لك التحقق مما إذا كنت على جهاز iPad ، لكنني لست متأكدًا أيضًا مما إذا كانت Apple توصي بفحص وقت التشغيل. إليك مقتطف من Apple:

بالإضافة إلى وحدات تحكم العرض الخاصة بك ، تحتاج أي فئات مشتركة بين أجهزة iPhone و iPad إلى تضمين وحدات الماكرو للتجميع الشرطي لعزل التعليمات البرمجية الخاصة بالجهاز. على الرغم من أنه يمكنك أيضًا استخدام اختبارات وقت التشغيل لتحديد ما إذا كانت فئات أو طرق محددة متوفرة ، إلا أن القيام بذلك سيزيد فقط من حجم القابل للتنفيذ عن طريق إضافة مسارات التعليمات البرمجية التي لن يتم اتباعها على جهاز واحد أو آخر. إن السماح للمترجم بإزالة هذا الرمز يساعد في الحفاظ على نظافة الكود.

ومع ذلك ، لا يوجد مكان يمكن أن أجد المزيد من المعلومات المحددة حول وحدات الماكرو للتجميع الشرطي.

بالنسبة لأهداف متعددة تشارك نفس المشروع/الكود ، أقوم بذلك عن طريق تحرير أعلام C لهدف iPad الخاص بي.

باستخدام الهدف [myapp] -ipad الذي تم اختياره كهدف نشط ، اختر Project-> تحرير الهدف النشط [myApp] -Ipad. ابحث عن "C Flags" وانقر نقرًا مزدوجًا. أضف علامة لـ "-D Target_ipad". الآن سيتم تعريف الرمز Target_ipad فقط لهدف iPad الخاص بك.

بالطبع ، هذا يعمل فقط إذا كنت تستخدم أهداف منفصلة لجهاز iPad و iPhone. إذا كنت تدير نفس الثنائي على كليهما ، فمن الواضح أنه لا يوجد شيء يمكن أن يفعله المترجم لك. (ومع ذلك ، فإن 3.2 SDK اعتبارًا من نهاية شهر يناير لا يدعم التطبيقات الشاملة حتى الآن.)

(تم تحريرها ؛ كنت مرتبكًا بشأن مصطلحات التطبيقات "العالمية" وما إلى ذلك)

أو -> فقط للتأكد

-(BOOL)isDeviceAniPad
{   
#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 30200
 BOOL deviceIsPad = ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad);
 return deviceIsPad;
#endif
 return NO;
}

أعتقد أن هذا سيفعل

-(BOOL)isDeviceAniPad
{   
#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 30200
  return ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad);
#endif
  return NO;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top