Как получить режим смешанного смешивания на простом UIView (не UIImage)

У меня есть изображение в приложении для iPad, и я в основном хочу поместить на него цветной фильтр. Для этого у меня есть цветной UIView, который замаскирован в определенную форму, которую я накладываю на изображение. Поскольку настройка альфы не дает мне желаемого эффекта, я бы хотел использовать режимы наложения.

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

Я также попытался растрировать представление на изображение, но это получилось все пиксельно и нечетно или что-то в этом роде, но, возможно, я сделал что-то не так.

Итак, основной вопрос: возможно ли применить режимы смешивания к представлениям? Или я должен использовать совершенно другой подход для достижения одной и той же цели?

Ответ 1

Взгляните на документы для CALayer compositingFilter: https://developer.apple.com/documentation/quartzcore/calayer/1410748-compositingfilter

В режиме цветного наложения вы можете установить view.layer.compositingFilter в CICategoryCompositeOperation, чтобы достичь смешивания с содержимым, стоящим за ним. Вот пример кода детской площадки с режимом многократного смешивания, применяемым для его проверки (замените UIImage(named: "") своим собственным изображением для тестирования)

import UIKit
import PlaygroundSupport

class MyViewController : UIViewController {
    override func loadView() {

        let mainView = UIView()
        self.view = mainView

        let image = UIImageView()
        image.translatesAutoresizingMaskIntoConstraints = false;
        image.image = UIImage(named: "maxresdefault.jpg")
        mainView.addSubview(image)

        let overlay = UIView()
        overlay.translatesAutoresizingMaskIntoConstraints = false;
        overlay.backgroundColor = .red
        overlay.layer.compositingFilter = "multiplyBlendMode"
        mainView.addSubview(overlay)

        mainView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|-0-[subview]-0-|", options: .directionLeadingToTrailing, metrics: nil, views: ["subview": view]))
        mainView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|-0-[subview]-0-|", options: .directionLeadingToTrailing, metrics: nil, views: ["subview": view]))

        mainView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|-0-[subview]-0-|", options: .directionLeadingToTrailing, metrics: nil, views: ["subview": overlay]))
        mainView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|-0-[subview]-0-|", options: .directionLeadingToTrailing, metrics: nil, views: ["subview": overlay]))
    }
}

PlaygroundPage.current.liveView = MyViewController()