#iphone #ios #coding-style #navigationbar
#iPhone #iOS #стиль кодирования #панель навигации
Вопрос:
После обновления до iOS 5 и Xcode 4.2 возникла небольшая проблема с дизайном
Вот как выглядел мой вид в iOS 4:
И вот как это выглядит в iOS 5:
В моем делегате навигации у меня есть следующий метод рисования «изображения» вверху:
- (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. (Конечно, это входит в мой список дел!)