- 改变话题字符串颜色;
光标不能移动到话题字符串中间,当用户光标移动至话题后面时,用户第一次点击键盘删除按钮,其实是选中这个话题的,再一次点击键盘删除按钮时,才会删除这个话题字符串
//
// EditViewController.swift
// eee
//
// Created by admin on 2022/6/6.
//
import UIKit
class EditViewController: UIViewController,UITextViewDelegate {
lazy var myTextView = {()->UITextView in
print("初始化--UITextView")
let textView = UITextView(frame: CGRect.zero)
// textView.backgroundColor = .clear
return textView;
}()
var changeRange:NSRange!
var isChanged : Bool!
var cursorLocation : NSInteger!
override func viewDidLoad() {
super.viewDidLoad()
self.title = "编辑界面"
self.view.backgroundColor = .red
self.view.addSubview(self.myTextView)
self.myTextView.delegate = self
self.myTextView.textColor = UIColor.black
self.myTextView.snp.makeConstraints { make in
make.left.equalTo(0)
make.top.equalTo(0)
make.right.equalTo(0)
make.height.equalTo(300)
}
let btn = UIButton(type: .custom)
btn.setTitle("插入话题", for: UIControl.State.normal)
btn.setTitleColor(UIColor.blue, for: UIControl.State.normal)
btn.addTarget(self, action: #selector(action), for: UIControl.Event.touchUpInside)
self.navigationItem.rightBarButtonItem = UIBarButtonItem(customView: btn)
}
@objc func action(){
let insertText = "#哈哈哈哈哈#"
self.myTextView.insertText(insertText)
print("初始化时selectedRange:\(self.myTextView.selectedRange)")
print("初始化时attributedText:\(self.myTextView.attributedText!)")
let tmpString = NSMutableAttributedString(attributedString: self.myTextView.attributedText)
tmpString.setAttributes([NSAttributedString.Key.foregroundColor : UIColor.blue,NSAttributedString.Key.font:UIFont.systemFont(ofSize: 20)], range: NSMakeRange(self.myTextView.selectedRange.location - insertText.count, insertText.count))
self.myTextView.attributedText = tmpString
}
func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
print("\(range)----\(text)");
if(text == ""){ // 删除
let rangeArray = getTopicRanageArray(attributedString: nil);
for i in 0 ..< rangeArray.count{
let tmpRange = rangeArray[i] as! NSRange
print("NSStringFromRange(tmpRange):\(tmpRange) == NSStringFromRange(textView.selectedRange):\(textView.selectedRange)")
if(range.location + range.length) == (tmpRange.location + tmpRange.length){
if(NSStringFromRange(tmpRange) == NSStringFromRange(textView.selectedRange)){
return true
}else{
textView.selectedRange = tmpRange;
return false
}
}
}
}else{ // 增加
// 话题在第一个后 重删除置text color
changeRange = NSMakeRange(range.location, text.count)
isChanged = true
// let rangeArray = getTopicRanageArray(attributedString: nil);
//
// if rangeArray.count > 0{
// for i in 0 ..< rangeArray.count{
// let tmpRange = rangeArray[i] as! NSRange
// changeRange = NSMakeRange(range.location, text.count)
// isChanged = true
//
// return true
if (range.location + range.length) == (tmpRange.location + tmpRange.length) {
return true
}
// }
// }else{
//
// return true
// }
//
}
return true
}
func textViewDidChange(_ textView: UITextView) {
if isChanged != nil && isChanged {
let tmpAString = NSMutableAttributedString(attributedString: self.myTextView.attributedText)
tmpAString.setAttributes([NSAttributedString.Key.foregroundColor : UIColor.black,NSAttributedString.Key.font : UIFont.systemFont(ofSize: 18)], range: changeRange)
self.myTextView.attributedText = tmpAString;
isChanged = false
}
}
func textViewDidChangeSelection(_ textView: UITextView) {
let rangeArray = getTopicRanageArray(attributedString: nil);
var inRange = false
for i in 0 ..< rangeArray.count{
let range = rangeArray[i] as! NSRange
if(self.myTextView.selectedRange.location > range.location && self.myTextView.selectedRange.location < range.location + range.length){
inRange = true
break
}
}
if inRange {
self.myTextView.selectedRange = NSMakeRange(self.cursorLocation, self.myTextView.selectedRange.length)
print("self.myTextView.selectedRange --- \(self.myTextView.selectedRange)")
return;
}
self.cursorLocation = self.myTextView.selectedRange.location
print("self.myTextView.selectedRange222 --- \(self.myTextView.selectedRange)")
}
func getTopicRanageArray(attributedString:NSAttributedString?) -> NSArray{
let traveAStr = (attributedString != nil ? attributedString : self.myTextView.attributedText)
let rangeArray = NSMutableArray()
var iExpression : NSRegularExpression?
do {
iExpression = try? NSRegularExpression(pattern:"#(.*?)#", options: NSRegularExpression.Options.init(rawValue: 0))
} catch {
}
if(iExpression != nil){
iExpression?.enumerateMatches(in: traveAStr!.string, options: NSRegularExpression.MatchingOptions.init(rawValue: 0), range: NSMakeRange(0, traveAStr!.string.count), using: { raesult, flags, stop in
var resultRange = raesult?.range
print(resultRange!)
// let attributedDIct = [traveAStr!.attributes(at: resultRange!.location, effectiveRange:&(resultRange!))]
//
// if (attributedDIct[NSAttributedString.Key.foregroundColor] as! UIColor) == UIColor.blue{
//
// }
rangeArray.add(resultRange!)
})
}else{
print("正则表达式有误!!!")
}
return rangeArray
}
}