Избегайте метода drawRect для iPad - PullRequest
0 голосов
/ 06 марта 2012

В настоящее время я создаю универсальное приложение, в котором я использую метод drawRect для отображения изображения в приложении navigationBar для iPhone, но я не хочу использовать этот метод для iPad.

Я создал категориюдля изменения UINavigationBar.В котором я сделал следующее.

    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)   
    { 
        // iPad mode ... dont load anything 
    }
    else 
    {
        // iphone mode .... use an image 
    }

После этого он отображает черное пустое пространство вместо панели навигации для iPad.Для iPhone это работает нормально.

Я пытался использовать self.navigationController.navigationBar.barStyle = UIBarStyleDefault;в моих представлениях Matser и Detail в viewDidLoad, но все равно он отображает черное пустое пространство.

Как избежать вызова метода drawRect, когда устройство является iPad.

Спасибо

Ответы [ 2 ]

1 голос
/ 06 марта 2012

Если вы использовали подклассы UINavigationBar, вы должны просто использовать правильный класс панели навигации на каждой платформе. Другими словами, проверка идиом интерфейса должна повлиять на создание панели навигации, а не на реализацию drawRect:.

Поскольку вы используете категорию для замены реализации drawRect: (что не следует делать), я думаю, что ваш единственный выбор - динамический метод Swizzling. То есть вы заменяете drawRect: только на iPhone / iPod Touch.

Рассмотрим подклассы UINavigationBar, так как это проще, безопаснее и чище. Это поможет вам избежать головной боли от совместимости.

РЕДАКТИРОВАТЬ: для примера предположим, что у вас есть файл пера, содержащий только пустой контроллер навигации с пользовательским подклассом UINavigationBar. Для этого выберите панель навигации в редакторе xib и измените ее класс в инспекторе.

UINavigationController *navigationController = nil;

if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad)
    navigationController = [[UINavigationController alloc] init];
else {
    UINib *nib = [UINib nibWithNibName: @"MyNavigationController" bundle: nil];
    navigationController = [[[nib instantiateWithOwner: nil options: nil] objectAtIndex: 0] retain];
}

При запуске на iPhone или iPod Touch этот код создает контроллер навигации из файла пера.

0 голосов
/ 06 марта 2012

Если вы вызовете [super drawRect] в начале метода, он вызовет реализацию по умолчанию, которая будет нормально рисовать UINavigationBar.

Причина, по которой вы не должны создавать пользовательский подкласс, заключается в том, что UINavigationController создает экземпляр его UINavigationBar напрямую, и вы не можете сказать ему использовать ваш подкласс.

...