Применение градиента к UIImage

Я хочу применить градиент цвета (сверху вниз) к изображению с именем «газетаImage». Это мой код, использующий быстрый язык.

@IBOutlet weak var newspaperImage: UIImageView!

func imageGradient(){
    let newspaperview = UIView(frame: newspaperImage.frame)
    let gradient = CAGradientLayer()
    gradient.frame = newspaperview.bounds
    let startColor = UIColor(red: 30, green: 113, blue: 79, alpha: 0).cgColor
    let endColor = UIColor(red: 0, green: 0, blue: 0, alpha: 1).cgColor
    gradient.colors = [startColor, endColor]
    newspaperview.layer.insertSublayer(gradient, at: 0)
    newspaperImage.addSubview(newspaperview)
    newspaperImage.bringSubviewToFront(newspaperview)
}

override func viewDidLoad() {
    super.viewDidLoad()

    imageGradient()
}

После пробежки я обнаружил, что он вообще не работает. Где проблема?

Возможный дубликат stackoverflow.com/questions/22810839/…

Harjot Singh 15.12.2018 08:16

Параметры UIColor указаны как значения от 0 до 1 (нормализованные значения 255).

MadProgrammer 15.12.2018 08:25

@MadProgrammer Тут нет ничего общего с параметрами. Если я поменяю код на let startColor =UIColor.white.cgColor, он все равно не сработает.

Mojie11 15.12.2018 08:48

Решайте по одной проблеме за раз;)

MadProgrammer 15.12.2018 08:48
stackoverflow.com/a/61703220/10505343 поможет вам решить эту проблему.
Wimukthi Rajapaksha 09.05.2020 22:31
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
3 815
1

Ответы 1

Сначала давайте начнем с того, что UIColor(red:green:blue:alpha) ожидает, что параметры будут нормализованными значениями 0-1.

Так...

let startColor = UIColor(red: 30, green: 113, blue: 79, alpha: 0).cgColor

должно быть

let startColor = UIColor(red: 30/255, green: 113/255, blue: 79/255, alpha: 0).cgColor

Затем я взял ваш базовый код и скопировал его в Playground.

let image = UIImage(named: "Miho_Small.png")

let imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 500, height: 500))
imageView.contentMode = .scaleAspectFit
imageView.image = image

let gradient = CAGradientLayer()
gradient.frame = imageView.bounds
let startColor = UIColor(red: 30/255, green: 113/255, blue: 79/255, alpha: 0).cgColor
let endColor = UIColor(red: 0, green: 0, blue: 0, alpha: 1).cgColor
gradient.colors = [startColor, endColor]
imageView.layer.insertSublayer(gradient, at: 0)

imageView

И это породило ...

Surprise

Ладно, это не то, чего я ожидал, но это не совсем неудивительно. CALayer нарисован поверх изображения, потому что изображение нарисовано функцией UIViewdraw.

Итак, как мы можем это исправить? Не вдаваясь в подробности создания новых изображений и закрашивания в них градиента и изображения, вы можете использовать "фон" UIView, на который накладываются слой и UIImageView ...

let image = UIImage(named: "Miho_Small.png")

let imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 500, height: 500))
imageView.contentMode = .scaleAspectFit
imageView.image = image
imageView.backgroundColor = nil

let backgroundView = UIView(frame: CGRect(x: 0, y: 0, width: 500, height: 500))

let gradient = CAGradientLayer()
gradient.frame = backgroundView.bounds
let startColor = UIColor(red: 30/255, green: 113/255, blue: 79/255, alpha: 0).cgColor
let endColor = UIColor(red: 0, green: 0, blue: 0, alpha: 1).cgColor
gradient.colors = [startColor, endColor]
backgroundView.layer.insertSublayer(gradient, at: 0)

backgroundView.addSubview(imageView)

backgroundView

который порождает ...

Better

И это, вероятно, больше похоже на то, чего вы пытаетесь достичь ...

:(, the two views can not be overlapped

Я не «перекрываю», так сказать, я добавляю UIImageView к backgroundView, который содержит CALayer. Помните, что представление frame относительно координатного пространства своего родителя.

Почти во всех случаях я предпочитаю использовать автоматический макет, и я предпочитаю использовать раскадровки, но на них сложно сделать int ответ, поэтому я сделал это вручную для этого примера ...

Example

class ViewController: UIViewController {

  override func viewDidLoad() {
    super.viewDidLoad()
    let image = UIImage(named: "Miho_Small.png")

    let imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 250, height: 250))
    imageView.contentMode = .scaleAspectFit
    imageView.image = image
    imageView.backgroundColor = nil

    let backgroundView = UIView(frame: CGRect(x: 0, y: 0, width: 250, height: 250))
    backgroundView.translatesAutoresizingMaskIntoConstraints = false

    let gradient = CAGradientLayer()
    gradient.frame = backgroundView.bounds
    let startColor = UIColor(red: 30/255, green: 113/255, blue: 79/255, alpha: 0).cgColor
    let endColor = UIColor(red: 0, green: 0, blue: 0, alpha: 1).cgColor
    gradient.colors = [startColor, endColor]
    backgroundView.layer.insertSublayer(gradient, at: 0)

    backgroundView.addSubview(imageView)

    view.addSubview(backgroundView)

    imageView.leadingAnchor.constraint(equalTo: backgroundView.leadingAnchor).isActive = true
    imageView.trailingAnchor.constraint(equalTo: backgroundView.trailingAnchor).isActive = true
    imageView.topAnchor.constraint(equalTo: backgroundView.topAnchor).isActive = true
    imageView.bottomAnchor.constraint(equalTo: backgroundView.bottomAnchor).isActive = true

    backgroundView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
    backgroundView.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true

    backgroundView.addConstraint(NSLayoutConstraint(item: backgroundView,
                                                    attribute: .width,
                                                    relatedBy: .equal,
                                                    toItem: nil,
                                                    attribute: .notAnAttribute,
                                                    multiplier: 1.0,
                                                    constant: 250))
    backgroundView.addConstraint(NSLayoutConstraint(item: backgroundView,
                                                    attribute: .width,
                                                    relatedBy: .equal,
                                                    toItem: backgroundView,
                                                    attribute: .height,
                                                    multiplier: 1.0,
                                                    constant: 0))


  }


}

Для чего это стоит, вы можете проверить проект, который я использовал для тестирования кода из GitHub - TestCALayerGradientAndImageOverlay

Большое тебе спасибо! Ваш ответ решил мою проблему :)

Mojie11 15.12.2018 09:27

Извините за беспокойство, но у меня есть другая проблема :(, два представления не могут совпадать. Вы можете увидеть мой снимок экрана по ссылке ниже. ссылка на сайт

Mojie11 15.12.2018 10:03

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

MadProgrammer 15.12.2018 10:46

Привет! Есть ли способ использовать градиент, чтобы изменить только альфа-значение и не добавлять цвет к градиенту? Как будто изображение должно исчезать снизу вверх?

Saad Tahir 29.09.2020 17:55

Другие вопросы по теме