[英]Apply CIFilters on UI elements
我想在UI元素上应用CIFilter。 我试图通过.filters成员将其应用于视图层。 但是,过滤器不会被应用。
这是一种方法:使用UIGraphicsGetImageFromCurrentImageContext
生成UIImage
,对其应用滤镜,然后将包含滤镜图像的图像视图覆盖在原始组件上。
这是一种模糊处理的方法( 摘自我的博客 ):
获得UIView的模糊表示非常简单:我需要开始一个图像上下文,使用视图层的renderInContext方法渲染到上下文中,然后从上下文中获取UIImage:
UIGraphicsBeginImageContextWithOptions(CGSize(width: frame.width, height: frame.height), false, 1)
layer.renderInContext(UIGraphicsGetCurrentContext()!)
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext();
填充完图像后,对它应用高斯模糊是相当标准的工作流程:
guard let blur = CIFilter(name: "CIGaussianBlur") else
{
return
}
blur.setValue(CIImage(image: image), forKey: kCIInputImageKey)
blur.setValue(blurRadius, forKey: kCIInputRadiusKey)
let ciContext = CIContext(options: nil)
let result = blur.valueForKey(kCIOutputImageKey) as! CIImage!
let boundingRect = CGRect(x: -blurRadius * 4,
y: -blurRadius * 4,
width: frame.width + (blurRadius * 8),
height: frame.height + (blurRadius * 8))
let cgImage = ciContext.createCGImage(result, fromRect: boundingRect)
let filteredImage = UIImage(CGImage: cgImage)
模糊图像将大于其输入图像,因此我需要明确说明createCGImage
所需的大小。
下一步是将UIImageView
添加到我的视图中,并隐藏所有其他视图。 我将UIImageView
子类BlurOverlay
以便在删除它时,可以确定不删除现有的UIImageView
:
let blurOverlay = BlurOverlay()
blurOverlay.frame = boundingRect
blurOverlay.image = filteredImage
subviews.forEach{ $0.hidden = true }
addSubview(blurOverlay)
关于去模糊,我想确保最后一个子视图是我的BlurOverlay
之一,将其删除并取消隐藏现有视图:
func unBlur()
{
if let blurOverlay = subviews.last as? BlurOverlay
{
blurOverlay.removeFromSuperview()
subviews.forEach{ $0.hidden = false }
}
}
最后,要查看UIView
当前是否模糊,我只需要查看其最后一个子视图是否为BlurOverlay
:
var isBlurred: Bool
{
return subviews.last is BlurOverlay
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.