Устранение характерного края размытия между UINavigationBar и UIVisualEffectView

В настоящее время моя иерархия представлений состоит из UIViewController (НЕ UITableViewController), UITableView, вложенного в контроллер представления, и UIVisualEffectView (с установленным значением Extra Light) перед UITableView, выровненным по нижней части UINavigationBar. Эффект, которого я хочу добиться, чем-то похож на эффект сегментированного представления в App Store.

Однако я заметил странный размытый край на границе между панелью навигации и UIVisualEffectView, из-за которого представление выглядит несогласованным, как показано на рисунке ниже (выделено красным кругом):

введите описание изображения здесь

В идеале я бы предпочел, чтобы UIVisualEffectView идеально сочетался с размытием UINavigationBar.

Спасибо.


person Pan Ziyue    schedule 08.07.2016    source источник
comment
почему бы вам просто не сделать однотонный фон, как выглядит ваш скриншот, у вас, похоже, ничего нет на заднем плане?   -  person Wain    schedule 12.07.2016
comment
Если я добавлю фоновый вид на панель навигации и вид эффекта, это сведет на нет точку представления эффекта размытия в первую очередь. В iOS 7 и более поздних версиях табличное представление фактически видно через полупрозрачную панель навигации.   -  person Pan Ziyue    schedule 13.07.2016
comment
Мне пришлось решить ту же проблему в приложении, которое я сейчас разрабатываю. Для меня это были tabBar и blurView, прикрепленные к его верхнему заголовку и заголовкам раздела таблицы, которые были прикреплены к нижней части панели навигации. Решение состояло в том, чтобы сделать UITabBar прозрачным (НЕ полупрозрачным -> НЕТ фона вообще) и расширить blurView вниз, чтобы заполнить пространство, занимаемое tabBar. Пожалуйста, дайте мне знать, если вам нужны примеры кода, как сделать панель прозрачной. :) - Боюсь, вы не можете установить флаг на UIBar, чтобы заставить его «смешиваться» с UIVisualEffectViews по краям. Хотя хотелось бы, чтобы меня фальсифицировали.   -  person CodingMeSwiftly    schedule 14.07.2016
comment
@Cabus, не могли бы вы добавить свой комментарий в качестве ответа? Этот метод работал очень хорошо!   -  person Pan Ziyue    schedule 15.07.2016
comment
Сделаю, как только будет время. Надеюсь до завтра :)   -  person CodingMeSwiftly    schedule 15.07.2016
comment
Срок действия награды скоро истекает, пожалуйста, опубликуйте свое решение как можно скорее, чтобы я мог присудить его вам. :)   -  person Pan Ziyue    schedule 17.07.2016
comment
Извините, но я не могу воспроизвести вашу проблему, помимо награды, было бы интересно ее проанализировать.   -  person Alessandro Ornano    schedule 19.07.2016


Ответы (2)


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

person Fujia    schedule 14.07.2016
comment
Я пытался использовать UIToolBar, когда изначально создавал этот экран, но, к сожалению, мне не удалось получить желаемую длину UISegmentedControl, чтобы она соответствовала UIToolBar (я хочу, чтобы сегментированный элемент управления соответствовал панели инструментов, оставив около 16 точек слева и правые края). Поэтому я остановился на UIVisualEffectView. - person Pan Ziyue; 14.07.2016
comment
UIVisualEffectView никогда не удовлетворит ваши потребности, поскольку он не выглядит так же, как полупрозрачная панель навигации. Вам, вероятно, лучше подумать о том, чтобы приложить усилия к изменению размера UISegmentedControl на панели инструментов. Один из способов — использовать гибкую прокладку с каждой стороны для центрирования элемента управления, а затем установить для него правильный размер в коде. - person Fujia; 15.07.2016
comment
Это действительно лучшее решение, не «красивое», но достаточно простое и работающее. Спасибо. - person Vin Gazoil; 24.03.2018

Глядя на ваше изображение, кажется, что ваша проблема связана не с UINavigationBar, а с представлением, в котором вы добавили UISegmentedControl. Я не знаю вашей структуры, но это может быть tableHeaderView (self.tableView.tableHeaderView), поэтому разумный способ решить эту проблему - изменить цвет заголовка:

Пример кода:

override func tableView(tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
        var headerView: UITableViewHeaderFooterView = view as! UITableViewHeaderFooterView
        header.contentView.backgroundColor = UIColor.clearColor()
        return header
}
person Alessandro Ornano    schedule 14.07.2016
comment
Я использовал такую ​​иерархию представлений: UINavigationController > UIViewController (not table view controller) > UITableView Поверх табличного представления (поскольку я использовал стандартное UIViewController в качестве основы) я добавил UIVisualEffectView, установленный на Extra Light, и вложил туда UISegmentedControl. - person Pan Ziyue; 14.07.2016
comment
Я пытался это сделать, я не могу воспроизвести вашу проблему, у вас есть GitHub или Gist или какой-то пример? - person Alessandro Ornano; 14.07.2016