Установите простой цветовой градиент в качестве фона UIToolbar

Я легко могу изменить цвет фона UIToolbar благодаря свойству Bart Tint в Интерфейсном Разработчике. Однако я хотел бы использовать простой двухцветный вертикальный градиент в качестве фона.

Решение должно работать с любой настраиваемой высотой панели инструментов, и моя цель - iOS 7+. Если это должно быть сделано программно, приветствуются Objective-C и Swift.

Изменить: на основе ответов, которые я делаю в viewDidLoad, но это не дает никакого эффекта:

var gradient = CAGradientLayer()
gradient.frame = toolbar.bounds
gradient.colors = [UIColor.redColor(), UIColor.greenColor()]
toolbar.layer.insertSublayer(gradient, atIndex: 0)

Редактировать 2: основываясь на ответах, я заменил следующую строку, но она по-прежнему не действует:

gradient.colors = [UIColor.redColor().CGColor, UIColor.greenColor().CGColor]

Редактировать 3: я понял. Сначала мне пришлось установить "Оттенок бара" на "По умолчанию" в Интерфейсном Разработчике, чтобы оттенок был прозрачным и не скрывал программно добавленный слой градиента.

4 ответа

Решение

Вы можете использовать CAGradientLayer для достижения этой цели.

Цель C:

CAGradientLayer *gradient = [CAGradientLayer layer];
gradient.frame            = yourToolbar.bounds;
gradient.colors           = [NSArray arrayWithObjects:(id)[[UIColor redColor] CGColor], (id)[[UIColor greenColor] CGColor], nil];
[yourToolbar.layer insertSublayer:gradient atIndex:0];

Swift:

var gradient:CAGradientLayer = CAGradientLayer()
gradient.frame               = yourToolbar.bounds
gradient.colors              = [UIColor.redColor().CGColor, UIColor.greenColor().CGColor]
yourToolbar.layer.insertSublayer(gradient, atIndex: 0)

Это работает

    var gradient:CAGradientLayer = CAGradientLayer()
    gradient.frame = self.toolbar.bounds
    gradient.colors = [UIColor.redColor().CGColor, UIColor.greenColor().CGColor]
    self.toolbar.layer.insertSublayer(gradient, atIndex: 0)

Это так же, как установка градиентного фона для UINavigationBar - вы можете использовать setBackgroundImage метод UIToolbar.

Просто добавьте эти два расширения:

extension UIImage {
    static func imageFromLayer (layer: CALayer) -> UIImage? {
        UIGraphicsBeginImageContext(layer.frame.size)
        guard let currentContext = UIGraphicsGetCurrentContext() else {return nil}
        layer.render(in: currentContext)
        let outputImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return outputImage
    }
}

extension UIToolbar {
    func setGradientBackground(barFrame: CGRect, aColor: UIColor, bColor: UIColor, aX: CGFloat, bX: CGFloat, aY: CGFloat, bY: CGFloat) {
        let gradientLayer = CAGradientLayer()
        gradientLayer.frame = frame
        gradientLayer.colors = [aColor.cgColor, bColor.cgColor]
        gradientLayer.locations = [0.0, 1.0]
        gradientLayer.startPoint = CGPoint(x: aX, y: aY)
        gradientLayer.endPoint = CGPoint(x: bX, y: bY)
        if let image = UIImage.imageFromLayer(layer: gradientLayer) {
            self.setBackgroundImage(image, forToolbarPosition: .bottom, barMetrics: .default)
        }
    }
}

Это создает UIImage из CAGradientLayer, а затем устанавливает его как фоновое изображение вашего UIToolbar. Затем просто примените его к вашему UIToolbar. Например, горизонтальный градиент от синего до белого:

myToolbar.setGradientBackground(
                barFrame: navigationBar.frame,
                aColor: UIColor.blue,
                bColor: UIColor.white,
                aX: 0.0,
                bX: 1.0,
                aY: 0.5,
                bY: 0.5
            )

Надеюсь это поможет!

// Используйте этот код:

I =2;

        leftColor = [UIColor colorWithRed:0.03 green:0.20 blue:0.95 alpha:1.0];
rightColor = [UIColor colorWithRed:0.98 green:0.00 blue:0.89 alpha:1.0];
gradient.frame = self.font_imageview.bounds;
gradient.colors = [NSArray arrayWithObjects:
                   (id)[rightColor CGColor],
                   (id)[UIColor clearColor].CGColor,
                   (id)[leftColor CGColor],nil];

[font_imageview.layer insertSublayer:gradient atIndex:0];

gradient.startPoint = CGPointMake(0.0, 0.5);
gradient.endPoint = CGPointMake(1.0, 0.5);}

Если вы используете настраиваемую панель инструментов, возможно, вы столкнулись с проблемой размера. view_toolbar может быть любым представлением. Здесь я нашел еще одно идеальное решение:

let gradientLayer = CAGradientLayer()
var bounds =  self.view_toolbar.bounds
bounds.size.height += UIApplication.shared.statusBarFrame.size.height
gradientLayer.frame = bounds
gradientLayer.colors = [colorPrimary, colorPrimaryDark]
gradientLayer.startPoint = CGPoint(x: 0, y: 0)
gradientLayer.endPoint = CGPoint(x: 1, y: 0)

self.view_toolbar.layer.insertSublayer(gradientLayer, at: 0)
Другие вопросы по тегам