使用 UIKit,我有一个 UITextView。我想模糊视图,以便文本看起来像这样:。这样它是可识别的文本,但难以辨认
我一直在尝试
UIBlurEffect
,但我得到的最接近的是下面的代码,它不应用任何类型的高斯模糊,而是用灰色模糊覆盖整个视图。
private lazy var textView: UITextView = {
let textView = UITextView()
let blurEffect = UIBlurEffect(style: .light)
let blurEffectView = UIVisualEffectView(effect: blurEffect)
blurEffectView.frame = textView.bounds
blurEffectView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
textView.addSubview(blurEffectView)
return textView
}()
考虑到我正在从事的工作的限制,重构为 SwiftUI 不是一个选择。
我认为没有一种内置方法可以完全满足您的需求。您可以通过在文本视图顶部添加图像视图并用文本视图的模糊图像填充它来模拟您想要的内容。
该代码可能看起来像这样:
//
// ViewController.swift
// BlurredTextView
//
// Created by Duncan Champney on 10/11/23.
//
import UIKit
class ViewController: UIViewController {
var blurRadius: CGFloat = 20
func blur(image: UIImage, withRadius radius: Float) -> UIImage {
let context = CIContext(options: nil)
guard var ciImage = CIImage(image: image) else {
fatalError("Can't create CGImage")
}
let imageExtent = ciImage.extent
ciImage = ciImage.clampedToExtent()
guard let filter = CIFilter(name: "CIGaussianBlur") else {
fatalError("Can't create filter")
}
filter.setValue(ciImage, forKey: kCIInputImageKey)
filter.setValue(radius, forKey: "inputRadius")
guard let result = filter.outputImage else {
fatalError("Can't get blurred image from filter")
}
guard let outputCG = context.createCGImage(result, from: imageExtent)
else {
fatalError("Can't convert CIImage to CGImage")
}
let output = UIImage(cgImage: outputCG)
return output
}
@IBOutlet weak var blurSwitch: UISwitch!
@IBOutlet weak var textView: UITextView!
@IBOutlet weak var blurView: UIImageView!
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func handleBlurSwitch(_ sender: UISwitch) {
print("In \(#function)")
if !sender.isOn {
blurView.isHidden = true
} else {
let renderer = UIGraphicsImageRenderer(size: textView.bounds.size)
let image = renderer.image { (context) in
textView.drawHierarchy(in: textView.bounds, afterScreenUpdates: true)
}
blurView.image = blur(image: image, withRadius: 10 );
blurView.isHidden = false
}
}
}
我用上面的代码在Github上创建了一个演示项目。您可以在这里下载。
结果如下所示:
(根据需要调整模糊半径。)