IOS 8 NavigationBar BackgroundImage

С iOS 8 изменилась концепция только размеров iPhone и iPad, а также портрет и пейзаж, и поэтому настройка фонового изображения на навигационных барах не работает. В настоящее время я использую следующий код:

UIImage *NavigationPortraitBackground = [[UIImage imageNamed:@"nav-image-portrait"]
                                         resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0)];

UIImage *NavigationLandscapeBackground = [[UIImage imageNamed:@"nav-image-landscape"]
                                          resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0)];

[[UINavigationBar appearance] setBackgroundImage:NavigationPortraitBackground forBarMetrics:UIBarMetricsDefault];
[[UINavigationBar appearance] setBackgroundImage:NavigationLandscapeBackground forBarMetrics:UIBarMetricsCompact];

Часть метрик штриховки устарела, начиная с iOS 8. При запуске моего приложения она просто повторяет изображение панели горизонтально, когда на iPhone 6 или 6 Plus. Я просмотрел фрагменты изображений, но я тоже не думаю, что это решение.

portraitlandscape

Ответы

Ответ 1

Я нашел решение. Мне нужно было использовать метод resizableImageWithCapInsets: resizingMode: и установить resizingMode в UIImageResizingModeStretch, иначе изображение все равно будет разбиваться на панели навигации.

Objective-C:

[[UIImage imageNamed:@"nav-image-portrait"]
                                         resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0) resizingMode:UIImageResizingModeStretch];

Swift 3/4:

UINavigationBar.appearance().setBackgroundImage(UIImage(named: "image")!.resizableImage(withCapInsets: UIEdgeInsets.zero, resizingMode: .stretch), for: .default)

Ответ 2

[[UINavigationBar appearance] setBackgroundImage:[[UIImage imageNamed:@"navbarimg.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0)] forBarMetrics:UIBarMetricsDefault];

Используйте приведенный выше код, который он работает. И использование изображения небольшого размера (40*navigarbarheight) 40 - это ширина изображения

Ответ 3

Это образец кода более точным и точным для всех размеров экрана. это поможет

CGRect screenRect = [[UIScreen mainScreen] bounds];
CGFloat screenWidth = screenRect.size.width;
[[UINavigationBar appearance] setBackgroundImage:[[UIImage imageNamed:@"header"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, screenWidth-50, 50)] forBarMetrics:UIBarMetricsDefault];