UINavigationBar и новый API внешнего вида iOS 5+ – как предоставить два фоновых изображения?

Я хочу использовать новый API внешнего вида iOS 5 для предоставления пользовательских фоновых изображений всем экземплярам UINavigationBar в моем приложении. Для этого это так просто:

[[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"whatever.png"] forBarMetrics:UIBarMetricsDefault]; 

Однако для каждого экземпляра я хочу предоставить другое изображение в зависимости от значения свойства translucent , например

 // For UINavigationBar instances where translucent returns YES: [[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"whatever-translucent.png"] forBarMetrics:UIBarMetricsDefault]; // Otherwise: [[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"whatever.png"] forBarMetrics:UIBarMetricsDefault]; 

Учитывая, что API-интерфейсы внешнего вида, похоже, настроены с использованием методов класса, что-то вроде этого возможно?

6 Solutions collect form web for “UINavigationBar и новый API внешнего вида iOS 5+ – как предоставить два фоновых изображения?”

На данный момент нет способа сделать то, что вы описываете, – прокси-сервер внешнего вида ничего не знает о каком-либо конкретном экземпляре в то время, когда вы его вызываете.

С практической точки зрения, что вам, вероятно, нужно будет сделать, это выяснить, сколько полупрозрачных баров у вас было бы v. Сколько непросвещенных было у вас. Выберите тот, который у вас есть, и используйте прокси-сервер внешнего вида для этого – для остальных, когда вы идете сделать его полупрозрачным (или запросить полноэкранный макет), вам придется установить фоновое изображение.

В то же время, можете ли вы подать запрос на повышение по адресу http://bugreport.apple.com/ по тому, что вы просите? Это не необоснованный запрос. Благодаря!

Вы можете либо установить его глобально с помощью прокси-сервера класса, либо установить его на экземпляр navBar.

В настоящее время я устанавливаю фон на экземпляр навигационной панели и, похоже, работает. У меня есть два разных navBars с разными фонами. Если вы установите его на экземпляр, вы сможете усовершенствовать код.

 UINavigationController *myNavController = [[UINavigationController alloc] initWithRootViewController:myView]; [viewControllers addObject:myNavController]; // not supported on iOS4 UINavigationBar *navBar = [myNavController navigationBar]; if ([navBar respondsToSelector:@selector(setBackgroundImage:forBarMetrics:)]) { // right here, you could condition bg image based on properties of this instance // of the navBar or any other condition. [navBar setBackgroundImage:[UIImage imageNamed:@"bg.jpg"] forBarMetrics:UIBarMetricsDefault]; } 

Если вы хотите установить метод класса, вы можете установить для всех:

 [[UINavigationBar appearance] setBackground ... 

Я признаю, что это довольно ново, и я просто понимаю, как большинство людей.

Этот ответ, вероятно, не поможет вам, но это может быть и для других. Если вы создадите подкласс, вы можете указать внешний вид для каждого подкласса отдельно. Например, у меня есть UITableviewCells и пользовательский класс, который получен из UITableViewCells. Я действительно делаю это по какой-то причине, но я обнаружил, что мне нужно вызвать [[UITableViewCells появление] setFont: […]] для обоих классов.

Поскольку вы, похоже, хотите сделать это на основе переменной, которую вы не узнаете до времени исполнения, вам, вероятно, не повезло!

Вы можете сделать это так, если знаете, какие классы содержат полупрозрачные полосы:

 [[UIBarButtonItem appearanceWhenContainedIn:[MyClassWithTranslucentBar class], [MyOtherClassWithTranslucentBar class], nil] setTintColor:desiredColor]; 

Я не могу оставить комментарий, поэтому должен быть ответ. Роб Уитлоу написал замечательную статью об этом. Проверьте это: http://ios-blog.co.uk/tutorials/ios-custom-ui-series-tabbar-navbar/

Попробуй это:

 if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_6_1) { // Load resources for iOS 6.1 or earlier navigationController1 = [self customizedNavigationController]; [navigationController1 setViewControllers:[NSArray arrayWithObject: self.homeViewController]]; [self setNavigationController:navigationController1]; [self.window setRootViewController:navigationController]; } else { // Load resources for iOS 7 or later navigationController1 = [[UINavigationController alloc] initWithRootViewController:self.homeViewController]; [self.window setRootViewController:navigationController1]; } - (UINavigationController *)customizedNavigationController { UINavigationController *navController = [[UINavigationController alloc] initWithNibName:nil bundle:nil]; // Ensure the UINavigationBar is created so that it can be archived. If we do not access the // navigation bar then it will not be allocated, and thus, it will not be archived by the // NSKeyedArchvier. [navController navigationBar]; // Archive the navigation controller. NSMutableData *data = [NSMutableData data]; NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data]; [archiver encodeObject:navController forKey:@"root"]; [archiver finishEncoding]; // Unarchive the navigation controller and ensure that our UINavigationBar subclass is used. NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data]; [unarchiver setClass:[LNTNavigationBar class] forClassName:@"UINavigationBar"]; UINavigationController *customizedNavController = [unarchiver decodeObjectForKey:@"root"]; [unarchiver finishDecoding]; // Modify the navigation bar to have a background image. LNTNavigationBar *navBar = (LNTNavigationBar *)[customizedNavController navigationBar]; [navBar setTintColor:[UIColor colorWithRed:0.39 green:0.72 blue:0.62 alpha:1.0]]; [navBar setBackgroundImage:[UIImage imageNamed:@"nav_bar_1024_46.png"] forBarMetrics:UIBarMetricsDefault]; [navBar setBackgroundImage:[UIImage imageNamed:@"nav_bar_1024_46.png"] forBarMetrics:UIBarMetricsLandscapePhone]; return customizedNavController; } 
  • Как изменить цвет фона UINavigationController?
  • Сделать название UINavigationBar доступным для редактирования
  • Большой текст панели навигации с несколькими цветами
  • Добавление нескольких настраиваемых кнопок на пользовательскую панель навигации
  • Скрытие строки состояния на одном ViewController в раскадровке
  • Как добавить представление ниже UINavigationBar
  • Как я могу сделать UINavigationController, который не является полноэкранным по ширине?
  • Панель навигации Навигация Элементы навигации, в результате чего верхняя область кнопок на толкаемом контроллере просмотра не может быть недоступна
  • Как изменить пространство между UIBarButtonItems в UINavigationBar?
  • Как создать пользовательскую панель навигации, например, приложение BestBuy?
  • Скрыть или отключить UIBarButtonItem в UINavigationBar
  • Interesting Posts

    Можете ли вы скачать что-то в формате PDF из приложения iphone

    Как «слить» основные конфигурации данных?

    Вставить пустое значение в подборщик даты в Iphone

    Сохранение себя с помощью вложенных блоков?

    Изменение размера ширины сайта в соответствии с шириной экрана iPad

    EZAudio не работает с устройствами Bluetooth

    Xcode Instruments, Time profiler – что означает «View as value»?

    Мониторинг нескольких регионов маяка не работает, но разработчики заявили, что это возможно? Мысли? (См. Мой код)

    Функция Swift возвращает два разных типа

    Попытка установить объект, не относящийся к свойствам – NSUserDefaults

    клавиатура iOS с кнопкой «Go» вместо возврата

    Передача событий касания к соответствующим UIViews братьев и сестер

    Организатор Xcode: Действительный идентификатор подписи не найден

    Autolayout – При использовании NSLayoutAttributeCenterX какой масштаб использует множитель?

    Swift – программно перейдите к другому контроллеру / сцене

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.