将渐变效果应用于模糊视图

时间:2016-11-14 21:54:10

标签: ios swift uiview

如何在Swift中添加具有模糊效果的渐变视图?我可以很容易地为视图添加渐变图层(CAGradientLayer)。我还可以单独添加模糊视图(UIVisualEffectView)。

如何将两者结合起来创建一个模糊视图,该视图还具有渐变元素,其中完全模糊渐渐消失为无模糊?

类似效果的一个例子:

Example of what I'm looking for

2 个答案:

答案 0 :(得分:1)

如果您知道CoreImage,则可以轻松地将两个过滤器链接在一起,一个来自CICategoryBlur,另一个来自CICategoryGradient。

以下是使用示例。要链,只需将第一个过滤器的输出作为下一个的输入:

var choose : String {
    if children.count == 1 || children.count == 0 {
        return "child"
    } else {
        return "children"
    }
}    

上面的链接是Apple文档。

答案 1 :(得分:0)

要获得具有渐变模糊半径的模糊视图,可以执行以下(per Apple document):

let ciContext = CIContext(options: nil)

if let inputImage = CIImage(image: yourUIImage) {
        let extent = inputImage.extent
        let h = extent.size.height
        guard let gradient = CIFilter(name: "CILinearGradient") else { return }
        gradient.setValue(CIVector(x: 0, y: 0.85 * h), forKey: "inputPoint0")
        gradient.setValue(CIColor.green, forKey: "inputColor0")
        gradient.setValue(CIVector(x: 0, y: 0.50 * h), forKey: "inputPoint1")
        gradient.setValue(CIColor(red: 0, green: 1, blue: 0, alpha: 0), forKey: "inputColor1")

        guard let mask = CIFilter(name: "CIMaskedVariableBlur") else { return }
        mask.setValue(inputImage.clampedToExtent(), forKey: kCIInputImageKey)
        // Set your blur radius here, default is 5
        mask.setValue(10, forKey: kCIInputRadiusKey) 
        mask.setValue(gradient.outputImage, forKey: "inputMask")

        guard let output = mask.outputImage,
            let cgImage = ciContext.createCGImage(output, from: extent) else { return }
        outUIImage = UIImage(cgImage: cgImage)
}

在这里,inputPoint0是渐变斜坡的起点,inputPoint1是终点。请注意,对于CIVector,y从下到上增加。设置的输入颜色无关紧要,仅使用其Alpha来确定模糊半径。

关于将CIFilter动态应用于其下的图像的第二个问题,不,这是不可能的。 backgroundFilters上有一个Apple document,可能会让您认为它是可行的,直到您在底部看到为止。

  

iOS的图层不支持此属性。

您应该做的是,每当您重置图像时,将上述操作应用于该图像并将其设置为图像视图。