Эффект размытия в реальном времени для панели навигации - строка состояния не входит
Следуйте этому вопросу, чтобы получить эффект размытия в реальном времени на панели навигации:
func addBlurEffect() {
var bounds = self.navigationController?.navigationBar.bounds as CGRect!
var visualEffectView = UIVisualEffectView(effect: UIBlurEffect(style: .Light)) as UIVisualEffectView
visualEffectView.frame = bounds
visualEffectView.autoresizingMask = .FlexibleHeight | .FlexibleWidth
self.navigationController?.navigationBar.addSubview(visualEffectView)
}
Но строка состояния остается полупрозрачной:
Как это исправить?
Отладка:
print(self.navigationController?.navigationBar.bounds)
// Returns (0.0, 0.0, 320.0, 44.0)
print(UIApplication.sharedApplication().statusBarFrame)
// Returns (0.0, 0.0, 320.0, 20.0)
3 ответа
Это отчасти потому, что вы устанавливаете рамку вида визуального эффекта на границы панели навигации. На снимке экрана вы видите границы панели навигации. Таким образом, вы можете компенсировать это, предоставив вашему визуальному эффекту вид другого кадра, т.е. переместите его начало на 20 пунктов и увеличьте его высоту.
Мне немного непонятно, почему вы не просто делаете навигационную панель полупрозрачной. Полупрозрачность панели навигации - это эффект размытия, и он поддерживается. То, что вы делаете - добавление подпредставления на панель навигации - нет.
Удалось заставить это работать, добавив это:
bounds.offsetInPlace(dx: 0.0, dy: -20.0)
bounds.size.height = bounds.height + 20.0
Что касается этой проблемы, я изменил более ранний ответ Кампая, оригинал которого был размещен здесь.
Код ниже будет размыть строку состояния, а также панель навигации.
Свифт 4:
func navigationBarBlur() {
let bounds = CGRect(x: 0.0, y: -20.0, width: UserDefaults.screenWidth, height: (self.navigationController?.navigationBar.bounds.size.height)! + 20.0)
let visualEffectView = UIVisualEffectView(effect: UIBlurEffect(style: .dark))
self.visualEffectView = visualEffectView
visualEffectView.frame = bounds
visualEffectView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
self.navigationController?.navigationBar.addSubview(visualEffectView)
}