Как убрать линию UINavigationBar и UISearchBar

Я создаю приложение iOS 7, в котором я хотел бы иметь панель поиска прямо под панелью навигации, и я хотел, чтобы они оба выглядели как единое целое. Поэтому мне нужно окрасить их в один и тот же цвет (уже сделано) и удалить эту линию в нижней части панели навигации и в верхней части панели поиска. Как я могу этого добиться?


person Guilherme    schedule 26.09.2013    source источник
comment
stackoverflow.com/a/21302744/1463604   -  person Nishant    schedule 23.01.2014


Ответы (5)


Официально это возможно только путем установки shadowImage панели навигации на пустое изображение. Однако при более внимательном рассмотрении документации сказано:

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

Используя пользовательское фоновое изображение, вы потеряете полупрозрачность размытого фона.

Если вы чувствуете себя предприимчивым, «линия волос» — это UIImageView, который является подвидом панели навигации. Вы можете найти его и сделать скрытым. Это то, что Apple делает, например, в своем родном приложении календаря. Не забудьте показать его, когда текущий вид исчезнет.

person Leo Natan    schedule 26.09.2013
comment
Я собираюсь использовать фоновое изображение, но панель навигации будет непрозрачной, поэтому в данном случае потеря эффекта размытия меня не коснется. Тогда другой вопрос: как я могу узнать, какое подпредставление нужно скрыть, поскольку оно содержит более одного UIImageView? - person Guilherme; 27.09.2013
comment
Если вы используете пользовательское фоновое изображение, вам не следует трогать иерархию представлений. Вы можете использовать пустой shadowImage. Я думаю, что в моем случае я скрыл все просмотры изображений. - person Leo Natan; 27.09.2013
comment
Я не мог заставить это работать. Я попытался установить shadowImage как прозрачный файл png 1x1, тот же файл, окрашенный тем же цветом, что и панель навигации, с [UIImage new] и даже nil, но ни один из них не работал. - person Guilherme; 27.09.2013
comment
Попробуйте сделать в методах внешнего вида. Когда ваше приложение загружается, но до загрузки контроллера представления, [[UINavigationBar appearance] setShadowImage:[UIImage new]]; - person Leo Natan; 27.09.2013
comment
Неа. Я добавил это в AppDelegate application:didFinishLaunchingWithOptions:, но тонкая линия осталась. - person Guilherme; 27.09.2013
comment
Если ваше приложение запускается непосредственно из раскадровки, контроллер представления загружается до application:didFinishLaunchingWithOptions:. - person Leo Natan; 27.09.2013
comment
Но ViewController, в котором содержится NavigationBar, не является первым загружаемым ViewController. Первый — это TabBarController, а его дочерние ViewControllers имеют NavigationBars. Это как-то облегчает? - person Guilherme; 27.09.2013
comment
Поставьте точку останова в методе initWithCoder: (вызывается при использовании пера) и посмотрите, какой из них вызывается первым. В нашем приложении это сработало, но мне не понравилась опция пользовательского фонового изображения. - person Leo Natan; 27.09.2013
comment
Это действительно сработало! Большое спасибо. Любая идея о том, как сделать то же самое с верхней линией волос SearchBar? - person Guilherme; 30.09.2013
comment
Я смог удалить панель поиска, просто используя фоновое изображение. - person Guilherme; 30.09.2013

используйте следующий код в AppDelegate (didFinishLaunchingWithOptions)

Быстрый :

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

Цель с:

    [[UINavigationBar appearance] setBackgroundImage:[[UIImage alloc] init]
                                  forBarPosition:UIBarPositionAny
                                      barMetrics:UIBarMetricsDefault];

[[UINavigationBar appearance] setShadowImage:[[UIImage alloc] init]];
person Nitesh    schedule 20.01.2015
comment
Для Swift 4... Обновите код до следующего UINavigationBar.appearance().setBackgroundImage(UIImage(), для: .any, barMetrics: .default) UINavigationBar.appearance().shadowImage = UIImage() - person Mohamed Saleh; 09.01.2019
comment
Спасибо @Мохамед Салех - person Nitesh; 11.01.2019

Свифт 3:

self.navigationController?.navigationBar.setValue(true, forKey: "hidesShadow")
person Valeriy    schedule 13.12.2016
comment
Почему мы должны устанавливать строку в качестве параметра ??, это не имеет смысла, гораздо лучше было бы установить перечисление. - person LeoGalante; 13.02.2017
comment
Искал и пробовал много разных решений. Это был единственный, который работал с UISearchController. - person jfredsilva; 28.09.2017
comment
Цель-C: [self.navigationController.navigationBar setValue:@(YES) forKeyPath:@hidesShadow]; - person jfredsilva; 28.09.2017

Один из способов избавиться от тонкой линии вверху и внизу UISearchBar — это заменить фоновое изображение на растягивающееся, у которого нет такой тонкой границы. Просто создайте квадратный png с цветом по вашему выбору, затем:

[searchBar setBackgroundImage:[[UIImage imageNamed:@"SearchBarImage"] resizableImageWithCapInsets:UIEdgeInsetsMake( 10, 10, 10, 10)]];

Поскольку фон сплошной, вы можете использовать практически любые значения для вставок.

person DobBobolina    schedule 11.09.2014
comment
Чтобы избежать бага внешнего вида, возникающего при переходе к поиску, я установил вставки на 0,0,0,0. Он по-прежнему отлично работал, и я не столкнулся с повреждением графики при нажатии на поле поиска. - person Jordan H; 30.10.2014

Для тех, кому интересно, как реализовать «авантюрный» подход @Leo Natan, я добавил пример кода в мой ответ на аналогичный вопрос.

person Serhii Yakovenko    schedule 03.11.2013