TabbarController و NavigationControllers في وضع المناظر الطبيعية، الحلقة الثانية

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

سؤال

لدي uitabbarcontroller، ويعن كل علامة تبويب إجراء UiviewController مختلفة يدفع على وحدات التحكم الجديدة حسب الحاجة. في اثنين من علامات التبويب هذه أحتاج، عند الوصول إلى وحدة تحكم محددة، القدرة على تدوير iPhone وتصور عرض في وضع أفقي. بعد أن تكافح الكثير، وجدت أنه من الفئة الفرعية إلزامية UITABBARCONTROLLER لتجاوز AntautorotateTointerFaceoration. ومع ذلك، إذا قمت ببساطة بإرجاع نعم في التنفيذ، فإن التأثير الجانبي غير المرغوب فيه التالي ينشأ:

يتم وضع كل وحدة تحكم في كل علامة تبويب تلقائيا في وضع أفقي عند تدوير iPhone.

حتى تجاوز AndautorotateoNterFaceorationoration في كل وحدة تحكم للعودة لا يعمل: عند تدوير iPhone، يتم وضع وحدة تحكم في وضع أفقي.

قمت بتنفيذ AntautorotatetointerFaceorationSoration على النحو التالي في UITABBARCONTROLLER الفرعية:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    if([self selectedIndex] == 0 || [self selectedIndex] == 3)
        return YES;

    return NO;
}

بحيث علامات التبويبتين فقط أنا مهتم في الواقع الحصول على دعم لوضع أفقي. هل هناك طريقة لدعم وضع المناظر الطبيعية لوحدة تحكم محددة على كومة علامة تبويب معينة؟

حاولت، دون نجاح، شيء مثل

(BOOL) ينبغي

if([self selectedIndex] == 0 || [self selectedIndex] == 3)
{   
   if ([[self selectedViewController] isKindOfClass: [landscapeModeViewController class]])
           return YES;
    }

     return NO;

}

أيضا، حاولت استخدام طريقة المندوب DidselectViewController، دون نجاح. أي مساعدة يحظى بتقدير كبير. شكرا لك.

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

المحلول

هذا عملت بالنسبة لي:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    if(self.selectedIndex == 0 && [[[self.viewControllers objectAtIndex:0] visibleViewController] isKindOfClass:[MyViewController class]])
        return YES;
    else
        return NO;
}

نصائح أخرى

إليكم امتداد إلى UITABBARCONTROLLER الذي يدعو المندوبون shouldAutorotateToInterfaceOrientation إلى وحدة تحكم الطفل المختارة حاليا. باستخدام هذا الملحق، لا تحتاج إلى الفئة الفرعية UITABBARCONTROLLER بعد الآن ويمكنك استخدامها shouldAutorotateToInterfaceOrientation في وحدات التحكم الخاصة بك مثل واحد يتوقع.

UITABBARCONTROLLER + Autorotate.h:

#import <UIKit/UIKit.h>

@interface UITabBarController (Autorotate)
@end

UITABBARCONTROLLER + Autorotate.m:

#import "UITabBarController+Autorotate.h"

@implementation UITabBarController (Autorotate)

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    UIViewController *controller = self.selectedViewController;
    if ([controller isKindOfClass:[UINavigationController class]])
        controller = [(UINavigationController *)controller visibleViewController];
    return [controller shouldAutorotateToInterfaceOrientation:interfaceOrientation];
}

@end

لقد تمكنت من استخدام هذا لفترة من الوقت الآن (من وحدة تحكم شريط علامة التبويب التطبيق الخاص بي) دون مشاكل:

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

بهذه الطريقة، في VC المناسب، نصل إلى حقيقة تحقق، في هذه الحالة لعرض معرض الصور (ماذا؟):

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    // Return YES for supported orientations
    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}

عرض معرضي ليس حتى في أعلى المكدس لوحدة تحكم نافذ معين. لا يزال يحصل دعا.

للأسف، اكتشفت أن هذا لا العمل بشكل جيد عندما يكون VC الكامنة داخل miewcontroller. (بدلا من علامات التبويب الأربعة الرئيسية). في هذه الحالة، لا يتم استدعاء معرض VC الخاص بي. أعتقد أنه لأن VC كنت أتصل طوال الوقت هو حقا وحدة تحكم NAV من علامة التبويب المحددة، والتي ومن بعد ينشر الأشياء إلى VC المناسب، في هذه الحالة معرض الصور الخاص بي VC. ولكن بالنسبة لمزيد من VC، لا تعمل الأمور بشكل جيد ... AAAAND تذهب إلى الهبوط الدوار من هناك. :

حاولت استخدام التعديلات عن طريق Andreas (انظر في مكان آخر في هذا الموضوع)، دون جدوى. أدلة ترحيب!

ركضت في نفس المشكلات كما فعلت عند العمل مع UITABBARCONTROLLER. كنت بحاجة للسيطرة على ما سمح له UiviewControllers بالتناوب والتي لم تكن كذلك. مشكلتي الرئيسية كانت مع علامة التبويب أكثر. لم أكن أريد أيا من OiviewControllers المدرجة في علامة التبويب أكثر لتدويرها.

كان الحل الخاص بي لإنشاء uitabbarcontroller الخاص بي الذي اتصلت mytabbarcontroller:

@interface MyTabBarController : UITabBarController <UITabBarDelegate> {

}

ثم قمت بتنفيذ طريقة indautorotateosterfaceorientation:

@implementation MyTabBarController

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
 UIViewController *controller = [self selectedViewController];

 if ((controller == [self moreNavigationController]) || ([self selectedIndex] == 4))
 {
  return interfaceOrientation == UIInterfaceOrientationPortrait;
 }

 return [controller shouldAutorotateToInterfaceOrientation:interfaceOrientation];
}

@end

كنت بحاجة إلى اكتشاف إذا تم اختيار علامة التبويب أكثر. هذه عملية من خطوتين؛ عند تحديد علامة التبويب أكثر في البداية، إرجاع API SelectionIndEx أعلى من 4، لذلك احتاجت إلى مقارنة وحدة التحكم المحددة باستخدام MorenAVIVICTONTroller.

إذا تم تحديد OiviewController من خلال علامة التبويب أكثر، فإن SELARENTENTEX هو أخيرا 4، لكن التحليل المحدد ليس هو morenavigationcontroller بعد الآن ولكن تم تحديد UiviewController.

ال إذا ((تحكم == [Self Morenavignavcontroller) || ([Self SelectandIntex] == 4) يعتني بهذه المسألة.

الآن، عندما أقوم بتشغيل تطبيقي UiviewControllers الخاص بي في علامة التبويب أكثر لا يتم تدويرها. آمل أن يساعد ذلك المطورين الآخرين الذين يركضون في نفس القضايا كما فعلت.

إميليو

من ما رأيته هنا وأماكن أخرى كنت مخيط معا حل يستخدم الطريقة shouldAutorotate منذ القديم shouldAutorotateToInterfaceOrientation تم إهمالها.

لقد وضعتها داخل فئة إلى Uitabbarcontroller. آمل أن يكون هذا مقبولا!

// call to method shouldAutorotate replaces call to method shouldAutorotateToInterfaceOrientation (deprecated)
-(BOOL)shouldAutorotate
{ // check whether selected view controller should autorotate    
  UIViewController *controller = self.selectedViewController;
  if ([controller isKindOfClass:[UINavigationController class]])
    { // in case it is a navigation controller: get visible view of that
      controller = [(UINavigationController *)controller visibleViewController];
    }
  return [controller shouldAutorotate];
}

شكرا لك شكرا لك شكرا لك. لقد كان هذا يومين في معرفة كيفية القيام بذلك. هنا هو My Take من كل مساعدة رائعة عندما يكون لديك TabbarController مع NavigationControllers.

- (BOOL) يجب أن تتراجع

UIViewController *controller = self.selectedViewController;
if ([controller isKindOfClass:[UINavigationController class]])
    controller = [(UINavigationController *)controller visibleViewController];

if([controller isKindOfClass:[LOCviewcontroller class]])
    return YES;
else
    if([controller isKindOfClass:[personWebSiteView class]])
        return YES;
else return NO; 

}

يرجع دائما أي نقد لرمز الرموز neopphite ... جاك

هل هو موافق حقا ل Subclass UITABBARCONTROLLER (كما هو مقترح في الإجابة المقبولة أعلاه)؟

لقد فهمت أن التفاح يقول شيئا كأنه "يجب ألا تخضع أبدا من الإبادة من أي وقت مضى uitabbarcontroller أو uinavigtcontroller" - أو هل أسيء فهمها؟

على أي حال؛ وجدت هذا البرنامج التعليمي حيث يقومون بتوصيلها A UiviewController الذي وضعوا فيه UITABBARCONTroller.

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