Инвертировать маску UIView MaskView

Я хочу применить перевернутую маску к моему UIView. Я установил маску в UIImageView с прозрачным изображением. Однако вывод с

view.mask = imageView

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

Иллюстрация того, что происходит по сравнению с тем, что я хочу.


person evenwerk    schedule 21.10.2017    source источник


Ответы (1)


Кажется, ты можешь сделать несколько вещей. Вы можете использовать изображение, которое у вас есть, но замаскировать белый вид и поместить за ним синий вид. Или вы можете настроить изображение, которое вы используете, обратив прозрачность. Или вы можете использовать CoreImage, чтобы сделать это в коде. Например:

func invertMask(_ image: UIImage) -> UIImage?
{
    guard let inputMaskImage = CIImage(image: image),
        let backgroundImageFilter = CIFilter(name: "CIConstantColorGenerator", withInputParameters: [kCIInputColorKey: CIColor.black]), 
        let inputColorFilter = CIFilter(name: "CIConstantColorGenerator", withInputParameters: [kCIInputColorKey: CIColor.clear]), 
        let inputImage = inputColorFilter.outputImage, 
        let backgroundImage = backgroundImageFilter.outputImage,
        let filter = CIFilter(name: "CIBlendWithAlphaMask", withInputParameters: [kCIInputImageKey: inputImage, kCIInputBackgroundImageKey: backgroundImage, kCIInputMaskImageKey: inputMaskImage]),
        let filterOutput = filter.outputImage,
        let outputImage = CIContext().createCGImage(filterOutput, from: inputMaskImage.extent) else { return nil }
    let finalOutputImage = UIImage(cgImage: outputImage)
    return finalOutputImage
}
person beyowulf    schedule 22.10.2017
comment
Удивительно! Единственная проблема, которая у меня есть, заключается в том, что imageView меньше, чем UIView, поэтому маска показывает только перевернутое изображение с вырезом. Как я могу это исправить? - person evenwerk; 22.10.2017
comment
Я полагаю, что проще всего установить frame из imageView таким же размером, как вид, который вы маскируете, и установить contentMode из imageView равным .scaleAspectFill, но трудно точно знать, что делать. Возможно, вы могли бы обновить свой вопрос с тем, что вы хотели бы, чтобы произошло. - person beyowulf; 22.10.2017