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
  • Увеличение и оживление высоты панели навигации?
  • как изменить передний цвет заголовка навигационной панели
  • iOS: настройка позиции заголовка UINavgationBar
  • Как изменить цвет панели навигации в iOS 7?
  • Предотвращение UINavigationBar в расширении Share от наследования основных параметров внешнего вида приложения
  • Пользовательские кнопки навигации навигатора ios
  • Как установить непрозрачное 1px изображение высокой тени для UINavigationBar?
  • Небалансные вызовы для перехода на начало / конец для <BTSViewController: 0x865c520>
  • Белая строка состояния исчезает, когда панель навигации отображается с оттенком цвета в iOS 7
  • PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.