سؤال

أقوم بتطوير تطبيق iPhone الذي يحتوي على العديد من المنظمات غير الحكومية، ويجب أن يكون المناظر الطبيعية فقط.

يتم تعيين التطبيق للبدء في وضع أفقي عبر معلوماته.

لدي اثنين من وحدات تحكم عرض:FirstViewController و SecondViewController.

لكل من هذه ملفات NIB، حيث العرض في المناظر الطبيعية. يتم إضافة كلا لوحات تحكم الرأي إلى بلدي MainView بنك الاستثمار القومي كمنافذ، ويتم تهيئة وجهات نظرهم بتكاسل.

عند تحميل التطبيق، يعرض العرض الأول في المناظر الطبيعية، كما هو متوقع. ومع ذلك، عند التبديل إلى الرأي الثاني، لا يزال الجهاز (أو المحاكي) في المناظر الطبيعية، ولكن يتم تدوير العرض، كما لو كان الجهاز في وضع عمودي، وكبح واجهتي.

معا UIViewController الطبقات لدي الكود التالي:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    return interfaceOrientation == UIInterfaceOrientationLandscapeRight;
}

وللإلغاء التبديل من المشاهدات، في تطبيقي المندوب الخاص بي أفعل:

[viewController.view removeFromSuperview];
[window addSubview:secondViewController.view];

أين viewController و secondViewController هي المنافذتين حيث يتم توصيل وحدات تحكم العرض.

هذه هي الطريقة التي ينظر العرض الثاني في IB:النص البديل http://img27.imageshack.us/img27/4898/picture1ni.png.

وهذه هي الطريقة التي تبدو في محاكاة:نص Alt http://img402.imageshack.us/img402/4866/picture2wt.png.

لماذا يتم عرض الرأي الثاني في المناظر الطبيعية ولكن مع تدوير الواجهة؟

لا أرغب في التعامل مع خصائص تحويل، لأن هذا يبدو مبالا.

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

المحلول

أحرزت هذا السؤال على أمل أن يمنحك شخص ما استجابة ثاقبة وأعلم شيئا ما .. للأسف أخشى أن تحتاج إلى استخدام التحولات للحصول على هذا للعمل بشكل صحيح. إليك الرمز الذي استخدمته مؤخرا لحل المشكلة:

- (void)forceLandscapeForView:(UIView *)theView {
  theView.transform = CGAffineTransformMakeRotation(degreesToRadian(90));
  theView.bounds = CGRectMake(0, 0, 480, 320);
  theView.center = CGPointMake(160, 240);
  [theView setNeedsLayout];
  [theView setNeedsDisplay];
}

ثم عند إضافة وجهة نظرك الجديدة، تحقق من الاتجاه الحالي وإذا لزم الأمر بالتناوب:

if (!UIDeviceOrientationIsLandscape([UIDevice currentDevice].orientation)) {
  [self forceLandscapeForView:_activeViewController.view];
}

ثم بالطبع تريد أن تستجيب بشكل مناسب shouldAutorotateToInterfaceOrientation في كل وحدة من وحدات التحكم الخاصة بك:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
  return UIInterfaceOrientationIsLandscape(interfaceOrientation);
}

أحب أن أسمع عن حلول بديلة إذا لم يكن هذا ضروريا. هناك أيضا تحذير واحد لاحظيت به مع هذا الإعداد: إذا كان لديك انتقال بين وجهات النظر، وأنت تدوير الهاتف أثناء هذا الانتقال، فمن الممكن أن يتم تقليد وجهات النظر أو "عالقا" على اتجاه المشهد الخطأ، مثل هذا تحتاج إلى إيقاف تشغيل الهاتف (الأفق، مقابل المناظر الطبيعية مقابل الأفق) أثناء التنقل بين المشاهدات.

نصائح أخرى

إنه مجرد اقتراح ولكن يمكنك محاولة إرجاع NO في طريقة Onlaotorotate للرأي الثاني. أو محاولة لجعلها في عرض صورة في IB. يبدو أنه تم تحميل وجهة نظرك بشكل صحيح (في وضع المناظر الطبيعية) ولكن بعد ذلك تلقى رسالة يجب أن يتجاوز 90 درجة.

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