Черный фон на прозрачном UITabBar

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

К сожалению, я не могу на всю жизнь меня заставить панель вкладок быть прозрачной. Независимо от того, что я делаю, на панели вкладок всегда есть черный фон, который предотвращает отображение основных контроллеров представлений.

Если я изменил альфа UITabBar на что-то низкое, я вижу, что табличное представление действительно стоит за ним, однако вы можете видеть, что UITabBar имеет какой-то фон, который предотвращает полное отображение таблицы (и я не хочу, чтобы элементы кнопки были невидимыми, только фон панели вкладок).

alpha 0.3 tab bar

Как это может быть?

В пользовательском представлении панели вкладок загрузился я:

self.tabBar.translucent = true
self.tabBar.alpha = 0.3
self.tabBar.backgroundColor = UIColor.clearColor().colorWithAlphaComponent(0.0)
self.tabBar.layer.backgroundColor = UIColor.clearColor().colorWithAlphaComponent(0.0).CGColor
self.tabBar.backgroundImage = nil
self.tabBar.shadowImage = nil

и в AppDelegate у меня есть:

UITabBar.appearance().barTintColor = UIColor.clearColor()
UITabBar.appearance().tintColor = kColorAccent
UITabBar.appearance().translucent = true
UITabBar.appearance().translucent = true
UITabBar.appearance().backgroundColor = UIColor.clearColor()
UITabBar.appearance().backgroundImage = nil
UITabBar.appearance().layer.backgroundColor = UIColor.clearColor().CGColor
UITabBar.appearance().shadowImage = nil

... да Это чрезмерно, но я хочу попробовать все.

Любые идеи о том, что делать?

Ответ 1

Сделать прозрачным UITabBar

Назначьте четкое изображение его backgroundImage. Вы можете использовать 1x1 clear.png или создать программно:

self.backgroundImage = UIImage.imageWithColor(UIColor.clearColor())

Это сделает UITabBar прозрачным:

Прозрачный

Добавить эффект размытия

Вставьте UIVisualEffectView в качестве заднего подсмотра.

let frost = UIVisualEffectView(effect: UIBlurEffect(style: .Light))
frost.frame = self.bounds
self.insertSubview(frost, atIndex: 0)

Вставьте UIBlurEffect (frost):

Frost

Пример

Морозная панель инструментов


  • Установите Пользовательский класс для UITabBar контроллера панели вкладок на FrostyTabBar.
  • У вас есть несколько вариантов доставки изображения clearColor. Вы можете создать образ clear.png с альфой из 0. Программное элегантное решение описано здесь.
  • Если вы используете clear.png, назначьте его в Фоновое изображение в Инспекторе атрибутов: введите описание изображения здесь
  • В интерфейсе Builder выберите Стиль: по умолчанию и полупрозрачный.
  • Как только вы возьмете управление размытием фона с помощью UIVisualEffectView, вы можете, в свою очередь, предоставить любой UIVisualEffect, который вы так желаете.

Весь класс FrostyTabBar выглядит следующим образом:

import UIKit

class FrostyTabBar: UITabBar {
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        let frost = UIVisualEffectView(effect: UIBlurEffect(style: .light))
        frost.frame = bounds
        frost.autoresizingMask = .flexibleWidth
        insertSubview(frost, at: 0)
    }
}

► Найдите это решение на GitHub и дополнительные сведения, включая 1x1 clear.png на Swift Recipes.

Ответ 2

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

class MainTabBar: UITabBar {
    var cleanDone = false

    override func layoutSubviews() {
        super.layoutSubviews()
        self.deleteUnusedViews()
    }

    func deleteUnusedViews() {
        if !self.cleanDone {
            var removeCount = 0
            for (_, eachView) in (self.subviews.enumerate()) {
                if NSStringFromClass(eachView.classForCoder).rangeOfString("_UITabBarBackgroundView") != nil {
                    eachView.removeFromSuperview()
                    removeCount += 1
                }
                if NSStringFromClass(eachView.classForCoder).rangeOfString("UIImageView") != nil {
                    eachView.removeFromSuperview()
                    removeCount += 1
                }
                if removeCount == 2 {
                    self.cleanDone = true
                    break
                }
            }
        }
    }
}

Ответ 3

imageWithColor был заменен на jotImage

let size = CGSize(width: tabBar.bounds.size.width,
                  height: tabBar.bounds.size.height)
tabBar.backgroundImage = UIImage.jotImage(with: UIColor.clear, size: size)

Ответ 4

единственное решение, которое работало для меня, было это:

UITabBar.appearance().shadowImage = UIImage()
UITabBar.appearance().backgroundImage = UIImage()

и установите: (вы также можете сделать это в раскадровке)

UITabBar.appearance().barTintColor = UIColor.clear

но то, что я должен установить в раскадровке:

  • панель вкладок: полупрозрачный → правда

Ответ 5

Также не забудьте снять флажок "Непрозрачный", чтобы сделать TabBar прозрачным: TabBar