سؤال

تحديث: انظر جوابي على هذا السؤال أولا. ويبدو أن هذا الخلل. تم إنشاء حالة اختبار الحد الأدنى وقد تم تقديم تقرير مع Apple. (ثابت اعتبارا من iPhone OS 3.1.)

إليك بوز من "أنا قريب جدا!"  قسم، أقسام.

لدي تطبيق تطبيق iPhone في شريط علامة التبويب. كل علامة تبويب تتميز uinavigcontroller. مع المشتبه بهم المعتادين (شريط التنقل، عرض الجدول ... الذي بدوره يمكن أن يؤدي إلى VC آخر، إلخ).

الآن، يتم استخدام أحد هؤلاء VCS المستوى الأدنى في Portait و أوضاع المناظر الطبيعية. ولكن هناك مشكلة. لدينا المناظر الطبيعية ودية VC AndAutorotateoNterFaceoration: لن يسمى خارج المربع! ما يجب القيام به؟

إليك ما نقوم به. في وحدة تحكم شريط علامة التبويب، التي قمت بتنفيذها في ملفها الخاص، لدي هذا:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
     return [self.selectedViewController shouldAutorotateToInterfaceOrientation:interfaceOrientation];
}

ينتهي هذا بنشر الطلب إلى VC الصديقة للمناظر الطبيعية، والذي يستجيب أيضا لهذه الرسالة. لا تنفذ جميع أجهزة VCS الأخرى هذه الطريقة، بحيث يذهبون ببساطة مع التوجه الافتراضي للرياضة.

تم حل المشكلة!!! ياي!

نحن سوف، ليس تماما. :(

يبدو أن الأمور لا تذهب جيدا عندما يتم استدعاء VC الصديق للمناظر الطبيعية من داخل أعماق وحدة تحكم شريط التبويب morenavigationcontroller..

قررت مقارنة / التباين بين VC دعا من داخل واحد من الأربعة الأولى شريط التبويب Uinavigcontrollers. ... وأن نفس VC دعا من داخل morenavigationcontroller.. وبعد سيكون هذا مفصولا للغاية، لذلك تحمل معي. نأمل أن تلعب اللعب بالعب مفيدة لأشياء Sleuthing.

عند تحميل التطبيقات، هناك العديد من المكالمات الأولية إلى Undautorotate Unterorotate ... طريقة. في هذه الحالات المبكرة، shilviewcontroller. هو لا شيء. ومع ذلك، ننتهي في النهاية التحميل، يتم تحديد عنصر علامة التبويب الأولي، وكل شيء على ما يرام.

حق. أولا، دعنا نختار أحد العناصر الثلاثة الأولى من العناصر والحفر إلى VC لدينا.

سنقوم باختيار عنصر شريط NAV ثالثا، لذلك هذه وحدة تحكم NAV الثالثة. نحن نتنقل إلى VC لدينا تدعم الدوران. يؤكد التفتيش السريع أن الوالد هو في الواقع وحدة تحكم NAV الثالثة من قائمة تحكم عرض شريط علامة التبويب لدينا. جيد!

دعنا ندوير الجهاز. يطلب من وحدة تحكم شريط التبويب التدوير (انظر الرمز أعلاه). نحن نلاحظ أن shilviewcontroller. هو أيضا أن وحدة تحكم NAV الثالثة، بالإضافة إلى أعلى وحدة تحكم عرض المراقبة في وحدة تحكم NAV، يتم تعيين كلاهما إلى VC Trusty الخاص بنا يدعم الدوران.

وبالتالي، فإن وحدة تحكم شريط التبويب سوف تتوجه interorotate. رسالة إلى وحدة تحكم NAV الثالثة ... ولكن لدينا VC الصديقة للدوران يحصل في النهاية على الرسالة. (أنا لا أفعل أي شيء خاص هنا. ربما يكون VC المطلوب يحصل على الرسالة لأنه الجزء العلوي و / أو المرئي VC؟) في أي حال، ندوير إلى المناظر الطبيعية، يتم تغيير حجم الأمور، وكل شيء على ما يرام. "نجاح رائع!"

الآن دعنا نضغط على هذا الزر مرة أخرى ويبوب مكدس VC، وترك الوضع المناظر الطبيعية في هذه العملية. يتم الاستعلام عن وحدة تحكم شريط التبويب مرة أخرى.

الوقت لفترة قصيرة هنا. ال TopViewController. بالنسبة إلى وحدة تحكم NAV الخاصة بنا لا تزال VC الصديقة للتوريد، ولكن visibleviewcontroller. تم تعيين الآن على uisnapshotmodalviewcontroller.في هيه. لم أر هذا واحد من قبل ... ولكن إريكا سادون لديه. وبعد يبدو أنه من أجل "تحكم عرض" تختفي "(والتي في هذه الحالة صحيح بالتأكيد - إنها تختفي بخير).

كما أواصل الابتدائية، يبقى VC المرئي كقابق، لكن أعلى VC يتغير في النهاية إلى VC التالي على المكدس، لأن VC الخاص بي يتم بلوغه في النهاية. عادلة بما فيه الكفاية.

وبالتالي هذا السيناريو حيث كل شيء يعمل بشكل جيد.

الآن دعونا نحاول نفس الاختبار، فقط هذه المرة سنذهب إلى morenavigationcontroller. (عنصر شريط علامة التبويب أكثر) والحفر إلى نفس فئة VC كما كان من قبل. في حالتي، يحدث ذلك هو الرقم السابع في قائمة VC Tab Bar Controller.

نحن ندخل VC على دراية الدوران و ... هذه المرة يحصل على تدوير مباشرةفي تحكم شريط التبويب هو ليس طلب إذن للتدوير على الإطلاق. همم.

فحص سريع للآباء VC يظهر أنه morenavigationcontroller.. وبعد حسنا، هذا منطقي.

الآن دعونا نحاول تدوير الجهاز. لا شيء يسمى. وبعد لا يوجد أي من نقاط التوقف لدينا ضرب. ليس في VC لدينا. ليس في تحكم شريط علامة التبويب لدينا. (هاه؟!؟!)

يا كااي. دعونا نوبي المكدس، والعودة إلى نفس VC وحاول تدويرها مرة أخرى. غريب. الآن نحصل على مكالمة في وحدة تحكم شريط التبويب طلب إذن التوجيه. هنا، وحدة التحكم المحددة هي وحدة تحكم NAV Trusty Trusty (# 7)، ولكن هذه المرة لها visibleviewcontroller. و TopViewController. نكون تعيين إلى nil.!

بمجرد المتابعة من هنا، تظهر رسالة غامضة في وحدة تصحيح الأخطاء:

باستخدام الرسوم المتحركة دوران مرحلتين. لاستخدام الرسوم المتحركة ذات المرحلة الأكثر سلاسة، يجب أن يزيل هذا التطبيق تطبيقات طريقة مرحلتين.

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

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

لن نزعج حتى عناء المكدس في هذه المرحلة.

أعتقد أن وحدة تحكم عرض تلميحات في المشكلة المحتملة:

إذا كنت ترغب في إجراء الرسوم المتحركة المخصصة أثناء تغيير الاتجاه، فيمكنك القيام بذلك بأحد طريقتين. التغييرات التوجيهية المستخدمة تحدث في خطوتين، مع حدوث الإخطارات في بداية ونقاط التناوب المتوسطة والعقلية. ومع ذلك، في iPhone OS 3.0، تمت إضافة الدعم لأداء تغييرات التوجيه في خطوة واحدة. يؤدي استخدام تغيير اتجاه واحد إلى حد ما إلى أن يكون أسرع من العملية القديمة من خطوتين ويوصى به عموما لأي رمز جديد.

أتساءل عما إذا كان morenavigationcontroller. لا يزال يستجيب للعملية من خطوتين، وبالتالي يتم تسوية أي محاولات لاستخدام عملية خطوة واحدة؟ لاحظ أنه إذا كنت ترد على الرسائل على الخطوتين، فلن يعمل المتغير من خطوة واحدة (مرة أخرى، لكل مستندات). أنا لا أستجيب لهم، ولكن لدي شكلا التسلل شيء وراء الكواليس.

في الواقع، إذا قمت بعلق طريقة خطوة واحدة، وحاول الاستجابة ل WillAnimatesecondhalfofrotationFrominterFaceoration: المدة:, ، أنا فعل الحصول على المذكرة! لكنها لا تزال لا تفلت عن المكدس نظيفة للغاية (من حيث الصور). حتى غريب: WillanimateFirsthalfofrotationFrominterFaceoration: المدة: لا يسمى، حتى عندما حاولت التسلل دعوة إلى الذات (باستخدام رسالة firsthalf) في AndAutorotateoNterFaceoration:. وبعد إنها تعود فورا خلال فترة، كما لو أنني لم تعرفها أبدا. تنهد.

هذه هي المسرحية للعب.

باختصار، لديه أي واحد تعامل نجح في التعامل مع دوران جهاز واحد لخطوة واحدة لاستدعاء VC من داخل Tab Bar Controller's Morenavcontroller؟ العقول الاستفسارية تريد أن تعرف!

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

المحلول

تقدم Apple مقابل فرعية UITABBARCONTROLLER، لذلك وجدت طريقة سهلة للتعامل مع التوعية باستخدام الفئات بدلا من ذلك. لا يصلح علة الخاص بك مع المزيد ... عرض وحدات التحكم، لكنني أعتقد أنها طريقة أكثر صديقة تفاحة للحصول على المهمة المنجزة (وتعني أقل فئة فرعية بالنسبة لك).

لجعل كل علامة تبويب في التطبيق التلقائي الخاص بي بشكل صحيح، قمت بتحديد -ShouldautorotateoNeDointerFaceorationSoration: في وحدات تحكم عرض مخصصة الخاصة بي، ولكنها جميعها داخل UinavControllers داخل UITABBARCONTroller، لذلك لن يتم إرسال الرسالة إلى أسفل السلسلة إلى VC الخاصة بي حتى هذين الاستجابة أيضا. لذلك أضفت الأسطر التالية إلى ملفات مفوض التطبيق الخاص بي:

إضافة إلى أسفل myappdelegate.h

@interface UITabBarController (MyApp)
@end

@interface UINavigationController (MyApp)
@end

إضافة إلى أسفل myappdelegate.m

@implementation UITabBarController (MyApp) 
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
    return YES;
}
@end

@implementation UINavigationController (MyApp) 
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
    return YES;
}
@end

نصائح أخرى

يبدو أن لدينا خطأ. لقد قمت بإنشاء حالة استنساخ، والحد الأدنى اختبار، وأبلغت عن مراسل علة التفاح (مشكلة الرادار 7139857.).

تحديث: تم إصلاح ذلك اعتبارا من iPhone OS 3.1.

المشكلة الأساسية هي:

عرض وحدات تحكم بالفعل على مكدس تحكم الملاحة لا تتلقى WillanimaterotationTointerFaceoration: المدة:الرسائل عند استخدام "وحدة تحكم نافذة تحكم شريط تحكم علامة التبويب قيد الاستخدام.

هذه المشكلة لا ليس تحدث عندما تكون وحدات تحكم عرض شريط علامة التبويب تحكم العرض الأساسية. فقط عندما تكون وحدات تحكم الملاحة و فقط عندما يكون التسلسل الهرمي للملاحة "أكثر" قيد الاستخدام.

تشير رسالة وحدة التحكم (فيما يتعلق بالرسوم المتحركة الدورانية على مرحلتين) إلى أن شيئا ما ضمن الإطار (كلما زاد عدد مراقب التنقل؟) لا تزال تستخدم رسوم متحركة من مرحلتين، على الرغم من أنه ينصح الآن مرحلة واحدة اعتبارا من iPhone OS 3.0.

التي يمكن أن تفسر لماذا WillanimaterotationTointerFaceoration: لا يسمى في هذه الحالة بالذات. لكل وثائق Controler View في Apple، لن يتم استدعاء هذه الرسالة عند استجابة رسائل الاتجاه الأول / المرحلة الأولى / الثانية بدلا من ذلك.

نسخة معدلة قليلا من إجابة فيكتورب مما يسمح بتحديد كل وحدة تحكم عرض واحدة إذا كان يسمح بالتناوب.

هنا باعتباره GIST لسهولة النسخ والمفردة

appdelegate.h.

@interface UITabBarController (MyApp)
@end

@interface UINavigationController (MyApp)
@end

appdelegate.m.

@implementation UITabBarController (MyApp) 
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
    UIViewController *selectedVC = [self selectedViewController];
    if ([selectedVC respondsToSelector:@selector(shouldAutorotateToInterfaceOrientation:)]) {
        return [selectedVC shouldAutorotateToInterfaceOrientation:toInterfaceOrientation];
    }

    //optimistic return - if you want no rotation, you have to specifically tell me!
    return YES;
}
@end

@implementation UINavigationController (MyApp) 
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
    UIViewController *visibleVC = [self visibleViewController];
    if ([visibleVC respondsToSelector:@selector(shouldAutorotateToInterfaceOrientation:)]) {
        return [visibleVC shouldAutorotateToInterfaceOrientation:toInterfaceOrientation];
    }

    //optimistic return - if you want no rotation, you have to specifically tell me!
    return YES;
}
@end
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top