Нижняя часть панели вкладок не окрашена должным образом - PullRequest
1 голос
/ 16 апреля 2020

Я хочу настроить цвет элемента панели вкладок в моем пользовательском подклассе UITabController, и он отлично работает, когда я делаю это с: tabBar.barTintColor = .blue (с любым системным или пользовательским цветом)

Но когда Я пытаюсь добавить градиент, используя свое собственное расширение UIImage

extension UIImage {
    static func gradientImageWithBounds(bounds: CGRect, colors: [CGColor]) -> UIImage {
        let gradientLayer = CAGradientLayer()

        gradientLayer.frame = bounds
        gradientLayer.colors = colors
        gradientLayer.startPoint = CGPoint(x: 0.5, y: 0.0)
        gradientLayer.endPoint = CGPoint(x: 0.5, y: 1.0)
        gradientLayer.masksToBounds = true

        UIGraphicsBeginImageContext(gradientLayer.bounds.size)
        gradientLayer.render(in: UIGraphicsGetCurrentContext()!)
        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return image!
    }
}

tabBar.barTintColor = UIColor(patternImage: UIImage.gradientImageWithBounds(bounds: tabBar.bounds, colors: [Colors.tabBarTopGradient, Colors.tabBarBottomGradient]))

. У меня проблемы с градиентом, который неправильно применяется к нижней части панели вкладок вокруг безопасной области телефона. Что мне здесь не хватает? Это выглядит так: enter image description here

Ответы [ 2 ]

3 голосов
/ 16 апреля 2020

Пожалуйста, попробуйте установить градиент оттенка в viewWillLayoutSubviews(). Надеюсь, это поможет!

1 голос
/ 17 апреля 2020

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

override func viewDidLoad() {
    super.viewDidLoad()

    var frame = tabBar.bounds
    let safeAreaHeight = safeAreaInsets.bottom
    frame.size.height = frame.size.height + safeAreaHeight

    tabBar.barTintColor = UIColor(patternImage: UIImage.gradientImageWithBounds(bounds: frame, colors: [UIColor.red.cgColor, UIColor.blue.cgColor]))
}

public var safeAreaInsets: UIEdgeInsets {
    guard let window: UIWindow = UIApplication.shared.windows.first else {
        return .zero
    }

    if #available(iOS 11.0, *),
        UIWindow.instancesRespond(to: #selector(getter: window.safeAreaInsets)) {
        return window.safeAreaInsets
    }

    return .zero
}
...