要在 UITextView 上实现滑动触摸到的文字颜色变得和背景颜色一样的效果,可以考虑以下步骤:

给 UITextView 添加一个 UIPanGestureRecognizer 手势,以便接收用户的滑动事件。

在 UIPanGestureRecognizer 的回调方法中,获取用户当前滑动的位置,并通过 UITextView 的 layoutManager 将这个位置转换为对应的文本位置。

根据文本位置获取到对应的字符,并将这个字符的前景色设置为和背景色一样的颜色,实现滑动触摸到的文字颜色变得和背景颜色一样的效果。

下面是一个简单的实现示例代码,可以参考一下:

class ViewController: UIViewController {
@IBOutlet weak var textView: UITextView!

override func viewDidLoad() {
super.viewDidLoad()

// 添加 UIPanGestureRecognizer 手势
let panGesture = UIPanGestureRecognizer(target: self, action: #selector(handlePan(_:)))
textView.addGestureRecognizer(panGesture)
}

@objc func handlePan(_ gesture: UIPanGestureRecognizer) {
let location = gesture.location(in: textView)

switch gesture.state {
case .changed:
// 将触摸位置转换为文本位置
if let textPosition = textView.closestPosition(to: location) {
// 获取对应的字符
let range = NSRange(location: textView.offset(from: textView.beginningOfDocument, to: textPosition), length: 1)
let attributes = textView.textStorage.attributes(at: range.location, effectiveRange: nil)

// 将字符的前景色设置为和背景色一样的颜色
if let backgroundColor = attributes[NSAttributedString.Key.backgroundColor] as? UIColor {
let foregroundColor = backgroundColor.withAlphaComponent(1)
textView.textStorage.addAttributes([NSAttributedString.Key.foregroundColor: foregroundColor], range: range)
}
}
case .ended, .cancelled:
// 恢复所有字符的前景色
let range = NSRange(location: 0, length: textView.text.count)
textView.textStorage.removeAttribute(NSAttributedString.Key.foregroundColor, range: range)
default:
break
}
}
}