Подтвердить что ты не робот

Как отключить тень навигационной панели в iOS 6 для панелей навигации с пользовательскими фоновыми изображениями?

Кажется, что в iOS 6 тень автоматически добавляется в панель навигации даже при настройке пользовательского фонового изображения. Я почти уверен, что это не относится к iOS 5, так как когда я тестирую один и тот же код в симуляторе iOS 5 и 6, тень появляется в iOS 6, но не 5.

Кто-нибудь знает об этом? Или как включить/отключить его?

4b9b3361

Ответ 1

Поместите это в свой AppDelegate

[[UINavigationBar appearance] setShadowImage:[UIImage new]];
// is IOS 7 and later
[[UINavigationBar appearance] setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault];

Вот что я сделал для меня. Надеюсь, это поможет!

Быстрая версия с обновлениями из комментариев

    UINavigationBar.appearance().shadowImage = UIImage()
    UINavigationBar.appearance().setBackgroundImage(UIImage(), forBarMetrics: .Default)

Ответ 2

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

self.navigationController.navigationBar.clipsToBounds = YES;

Ответ 3

Примечание от Apple dev docs относительно объекта shadowImage:

Обсуждение: Значение по умолчанию равно nil, что соответствует умолчанию теневое изображение. Когда non-nil, это свойство представляет собой пользовательскую тень изображение для отображения вместо значения по умолчанию. Для пользовательского изображения теней показано, что пользовательское фоновое изображение также должно быть установлено с помощью setBackgroundImage: forBarMetrics: метод. Если фон по умолчанию используется изображение, тогда изображение тени по умолчанию будет использоваться независимо от значения этого свойства.

Итак, чтобы использовать nil UIImage hack, вы также должны настраивать фоновое изображение пользовательской навигационной панели. Это тоже может быть ноль, что приводит к хорошей плоской, чистой навигационной панели стиля "метро":

[[UINavigationBar appearance] setShadowImage:[[UIImage alloc] init]];
        [[UINavigationBar appearance] setBackgroundImage:[[UIImage alloc] init] forBarMetrics:UIBarMetricsDefault];

Ответ 4

Также вы можете попробовать следующее:

controller.navigationBar.shadowImage = [[[UIImage alloc] init] autorelease];
Контроллер

является UINavigationController.

Ответ 5

Общий ответ, не связанный с NDA:

Если вы не хотите, чтобы что-то торчало из слоя, замаскируйте слой его границами.

[self.layer setMasksToBounds:YES];

Установите высоту явно на 44 (или 32 для пейзажа на iPhone), если это не работает само по себе.

Ответ 6

Настройка shadowImage на нулевое изображение работает, однако, способ представления решения приводит к добавлению свойства, если ОС раньше iOS 6.

Лучший способ сделать то, что зависит от существования свойства или метода, это:

if ([self.navigationController.navigationBar
respondsToSelector:@selector(shadowImage)]) {
self.navigationController.navigationBar.shadowImage = [[[UIImage alloc] init] autorelease];
}

Ответ 7

Существует два возможных решения, второе из которых упоминается в других ответах.

  • Добавьте один прозрачный пиксель в нижней части вашего фонового изображения на панели навигации, сделав его высотой 45 футов. Это отключает тени в iOS 6.
  • Внедрите следующий код:

    // Omit the conditional if minimum OS is iOS 6 or above
    if ([UINavigationBar instancesRespondToSelector:@selector(setShadowImage:)]) {
        [[UINavigationBar appearance] setShadowImage:[[UIImage alloc] init]];
    }
    

Источник: Расширенная настройка внешнего вида на iOS, @27: 15

Ответ 8

Так как self.navigationController.navigationBar.shadowImage = [[UIImage alloc] init]; не работает, я нашел простой и работоспособный способ удалить тень UINavigationBar как в iOS 6, так и в iOS 5. Надеюсь, что люди, которые нуждаются, могут видеть этот пост.

Все, что вам нужно сделать, - подготовить одно фоновое изображение, чтобы высота была на 1 пиксель больше, чем высота вашей навигационной панели (например, 320 × 45 для UINavigationBar по умолчанию, 640 × 90 для 2x, конечно).

Затем просто используйте [[UINavigationBar appearance] setBackgroundImage: ...], вы обнаружите, что тень заменяется на 1 пиксель. ура!

Кстати, я нашел, что Twitter сделал то же самое, если вы распакуете Twitter.ipa и посмотрите в bg_nav_bar_events_dark.png, размер 320 × 47. Они создали собственную тень на 3 пикселя:)

Ответ 9

Я не могу комментировать, поэтому я добавлю свою информацию здесь.

Возможно, приведенные выше предложения работали в бета-версии, но, похоже, это не так.

self.navigationController.navigationBar.shadowImage = [[UIImage alloc] init];

Вышеприведенное не работает, ни один из других подобных ответов выше. Я попробовал их все.

Обрезание до границ работает, но не дает результата, который я хочу, так как хотелось бы, чтобы другие представления зависали вне панели навигации.

Ответ 10

Я столкнулся с этим вопросом SO, пытаясь заставить навигационные панели выглядеть одинаково между iOS6 и iOS7.

Ответ, который я нашел, был просто использован:

    NSMutableDictionary *titleBarAttributes = [NSMutableDictionary dictionaryWithDictionary: [[UINavigationBar appearance] titleTextAttributes]];
    [titleBarAttributes setValue:[NSNumber numberWithInt:0] forKey:UITextAttributeTextShadowOffset];
    [[UINavigationBar appearance] setTitleTextAttributes:titleBarAttributes];

т.е.: установить смещение тени к нулю.

Ответ 11

У меня была та же проблема, и я решил ее, выполнив следующие действия:

CustomNavBar *navBar = (CustomNavBar *)self.navigationController.navigationBar;
        [navBar setBackgroundImage:[UIImage imageNamed:@"navigation_bar_gray.png"] forBarMetrics:UIBarMetricsDefault];
        navBar.shadowImage = [[UIImage alloc]init]; // this is what acctually removed the shadow under navigation bar 

Ответ 12

Как насчет альтернативного способа:

UINavigationBar.appearance().barStyle = .Black

Для темных навигационных панелей iOS не отображает тень.

Ответ 13

В Swift 3.0 это будет выглядеть как

UINavigationBar.appearance().shadowImage = UIImage ()
UINavigationBar.appearance().setBackgroundImage(UIImage(), for: .default)