Я пытаюсь добавить UIImage
для настройки моего tabBar
так же, как я сделал со своим navigationBar
, но, похоже, это не работает.
Сначала я создаю CAGradientLayer
, а затем превращаю его в UIImage
. Вот код:
extension CALayer {
func createImageFromLayer() -> UIImage?{
frame = CGRect(x: 0, y: 0, width: 1000, height: 1000)
UIGraphicsBeginImageContext(frame.size)
guard let context = UIGraphicsGetCurrentContext() else {return nil}
render(in: context)
let output = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return output
}
}
class CustomTabBarController: UITabBarController {
let grad: CAGradientLayer = {
let gradient = CAGradientLayer()
gradient.colors = [UIColor.clear, UIColor.black]
gradient.locations = [0,1]
return gradient
}()
override func viewDidLoad() {
super.viewDidLoad()
let tabImage = grad.createImageFromLayer()
self.tabBar.isTranslucent = true
self.tabBar.backgroundImage = tabImage
self.tabBar.shadowImage = UIImage()
}
}
Установка образа для моего navigationBar
отлично работала с использованием этого метода:
navigationController?.navigationBar.setBackgroundImage(barImg, for: UIBarMetrics.default)
В этом коде barImg
- это UIImage
, созданный из CAGradientLayer
, как и tabBar
. Я проверил, является ли tabImage
nil
, и это не так.
Кажется, что у tabBar
нет такой функции, как tabBar.setBackgroundImage
, как у navigationBar
. Как мне это сделать?
Единственный результат, который я получаю, - это полностью чистый фон для моего tabBar
без добавления градиента, и я не знаю, что мне здесь не хватает, если tabBar.backgroundImage
не работает.
Спасибо за ответы.
Сначала, когда вы устанавливаете цвета для CAGradientLayer
, вы должны использовать только объекты CGColor
. Поэтому вам нужно изменить эту строку на
gradient.colors = [UIColor.clear.cgColor, UIColor.black.cgColor]
После этого ваш tabImage
не будет пустым и станет видимым.
Последняя проблема заключается в том, что вы всегда устанавливаете размер изображения на 1000x1000
пикселей. Это слишком много. Чтобы исправить это, вы можете передать целевой размер кадра в createImageFromLayer
в качестве параметра. Его подпись станет примерно такой.
func createImageFromLayer(targetFrame: CGRect) -> UIImage?
В вашем случае targetFrame
- это tabBar.bounds
.