Проблема со стилем панели навигации при переключении с iOS 4 на 5

#iphone #ios #coding-style #navigationbar

#iPhone #iOS #стиль кодирования #панель навигации

Вопрос:

После обновления до iOS 5 и Xcode 4.2 возникла небольшая проблема с дизайном

Вот как выглядел мой вид в iOS 4:

1 http://casperslynge.dk/1

И вот как это выглядит в iOS 5:

2 http://casperslynge.dk/2

В моем делегате навигации у меня есть следующий метод рисования «изображения» вверху:

 - (void)drawRect:(CGRect)rect {
    UIImage *image;
    if(self.barStyle == UIBarStyleDefault){
        image = [UIImage imageNamed: @"topbar_base.png"];
    }
    else{
        image = [UIImage imageNamed: @"nyhedsbar_base.png"];    
    }
    [image drawInRect:CGRectMake(-1, -1, self.frame.size.width 3, self.frame.size.height 3)];
}
  

И внутри моего контроллера я установил следующее:

 self.navigationBarStyle = UIBarStyleBlack;
  

Почему он не работает в iOS 5?

Спасибо

Комментарии:

1. Используете ли вы подклассы или категории для пользовательского чертежа?

Ответ №1:

В iOS5 вам необходимо использовать UIAppearance . Взгляните на это. Вот пример его условного использования, чтобы вы могли продолжать поддерживать iOS4:

 // iOS5-only to customize the nav bar appearance
if ([[UINavigationBar class] respondsToSelector:@selector(appearance)]) {
    UIImage *img = [UIImage imageNamed: @"NavBarBackground.png"];
    [[UINavigationBar appearance] setBackgroundImage:img forBarMetrics:UIBarMetricsDefault];
}
  

Как вы можете видеть, это устанавливает пользовательское фоновое изображение для всех панелей навигации. Есть много вещей, которые вы можете сделать с появлением пользовательского интерфейса. Вы захотите сохранить все пользовательские данные, которые вы сейчас drawRect: используете, поскольку устройства до iOS4 по-прежнему будут использовать это, а не новый код появления пользовательского интерфейса.

Комментарии:

1. Если вы используете подклассы (а не категории, что, как я подозреваю, может делать Каспер Слиндж), вы можете использовать один и тот же код как для iOS5, так и для всего, что приведено ниже.

2. В моем конкретном случае приведенный выше код был добавлен, когда мы тестировали совместимость с iOS5. У нас был drawRect: определенный в категории, чтобы делать то же самое, что и OP. Мы сохранили код drawRect для устройств до iOS5; по-видимому, он не вызывается в iOS5. Кроме того, приведенный выше код появления пользовательского интерфейса должен был быть вызван НАМНОГО раньше (в application:didFinishLaunchingWithOptions:), чем код drawRect вызывается системой для получения какого-либо эффекта.

3. Таким образом, приведенный выше код будет применяться для каждой панели навигации. Что, если я хочу переключаться между двумя разными изображениями?

4. Да, это в основном то, что я говорю 🙂 Согласно документам Apple, переопределение методов в категориях является и было просто неправильным (без обид), но это сделано во многих руководствах.

5. @CasperSlynge Я думаю, вы можете добиться этого, немного изменив использование UIAppearance в этом случае. Я полагаю, что вы можете указать характеристики внешнего вида для классов, которые появляются в других классах или, возможно, даже для объектов данного класса. Честно говоря, я решил свою проблему и перешел к следующей проблеме, не углубляясь в UIAppearance. (Конечно, это входит в мой список дел!)