gpt4 book ai didi

swift - 使用 TextKit 突出显示单词,选择重复单词的错误出现

转载 作者:行者123 更新时间:2023-11-28 08:20:03 25 4
gpt4 key购买 nike

我实际上正在开发一个古兰经应用程序,我在其中使用 TextKit 来突出显示经文并更改它们的颜色。一切都很顺利,但我对出现多次的单词有点问题。首先,我的代码是:

    import UIKit

class ViewController: UIViewController {

let attributedBackgroundColor = [ NSBackgroundColorAttributeName: UIColor.lightGray ]
var myVerses = ["بِسْمِ اللَّهِ الرَّحْمَنِ الرَّحِيمِ","الْحَمْدُ لِلَّهِ رَبِّ الْعَالَمِينَ","الرَّحْمَنِ الرَّحِيمِ","مَالِكِ يَوْمِ الدِّينِ","إِيَّاكَ نَعْبُدُ وَإِيَّاكَ نَسْتَعِينُ","اهدِنَا الصِّرَاطَ الْمُسْتَقِيمَ","صِرَاطَ الَّذِينَ أَنْعَمْتَ عَلَيْهِمْ غَيْرِ الْمَغْضُوبِ عَلَيْهِمْ وَلاَ الضَّالِّينَ"]

@IBOutlet weak var textView: UITextView!

override func viewDidLoad() {
super.viewDidLoad()

let string = NSMutableAttributedString(string: "Vide initialement")
string.addAttribute(NSFontAttributeName, value: UIFont.systemFont(ofSize: CGFloat(25.0)), range: NSRange(location: 0, length: string.length))
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.alignment = .center
string.addAttribute(NSParagraphStyleAttributeName, value: paragraphStyle, range: NSRange(location: 0, length: string.length))

textView.attributedText = string
let singleTap = UITapGestureRecognizer(target: self, action: #selector(ViewController.tapRecognized))
singleTap.numberOfTapsRequired = 1
textView.addGestureRecognizer(singleTap)
textView.isEditable = false
textView.isSelectable = false

var str = ""

// Ajouter numérotation aux verses - Add numerotation to verses.
for i in 0..<myVerses.count {
if i > 0 {
str += "("+"\(i)"+")"
}
str += String(myVerses[i])
}
print(str)
textView.text = str + "("+"\(myVerses.count)"+")"
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}


// Sélection des verses - Select Verses
func tapRecognized(_ recognizer: UITapGestureRecognizer) {
if recognizer.state == .recognized {
let point = recognizer.location(in: recognizer.view)
let detectedText = self.getWordAtPosition(pos: point, in: textView)
if (detectedText != "") {
print("detectedText == \(detectedText)")
let string = NSMutableAttributedString(string: self.textView.text)
let verses = self.textView.text.components(separatedBy: ")")



if let detectedRange = textView.text.range(of: detectedText) {
let startPosOfSubstring = textView.text.distance(from: textView.text.startIndex, to: detectedRange.lowerBound)
let detectedLength = detectedText.characters.count
let rangeOfSub = (startPosOfSubstring,detectedLength)
print("-- rangeofSub == " ,rangeOfSub)
let rangeOfSubstring = NSRange(location: startPosOfSubstring, length: detectedLength)


for verse: String in verses {
if let detectedVerse = textView.text.range(of: verse) {
let startPosOfVerse = textView.text.distance(from: textView.text.startIndex, to: detectedVerse.lowerBound)
let detectedLengthOfVerse = verse.characters.count

let tupleVerse = (startPosOfVerse,detectedLengthOfVerse)
print("++ rangeofVerse == " ,tupleVerse)
let rangeOfVerse = NSRange(location: startPosOfVerse, length: detectedLengthOfVerse)
print(verse)


let range = (self.textView.text as NSString).range(of: verse)
let contained = NSLocationInRange(rangeOfSubstring.location, rangeOfVerse)
if (contained) {
print ("************************************")
print("contained is :" ,contained)
print ("************************************")

string.addAttribute(NSForegroundColorAttributeName, value: UIColor.red, range: range)
string.addAttribute(NSBackgroundColorAttributeName, value: UIColor.darkGray, range: range)
string.addAttribute(NSFontAttributeName, value: UIFont.systemFont(ofSize: CGFloat(25.0)), range: NSRange(location: 0, length: string.length))
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.alignment = .center
string.addAttribute(NSParagraphStyleAttributeName, value: paragraphStyle, range: NSRange(location: 0, length: string.length))

}
print ("--------------------------------------------")

}

}
self.textView.attributedText = string
} else {
print("detectedText is empty")
}
}
}
}



func getWordAtPosition( pos: CGPoint, in textview: UITextView) -> String {
//Eleminer le balancement du scroll - eliminate scroll offset
// var pos = pos
// pos.y += tv.contentOffset.y
//Position du text tapé au point - get location in text from textposition at point
let tapPos = textview.closestPosition(to: pos)
//Avoir le mot tapé dans la position du point - fetch the word at this position (or nil, if not available)
if let wr = textview.tokenizer.rangeEnclosingPosition(tapPos!, with: .word, inDirection: UITextLayoutDirection.right.rawValue) {
print(pos)
return textview.text(in: wr)!
}else{
return ""
}

}
}

当我在模拟器上运行我的应用程序时,我选择了一节经文,一切都很顺利。

正常使用:

Normal Use

问题出在多次出现的单词上。例如,对于出现两次的单词“الرحمن”,无论我选择第一个还是第二个,突出显示的诗句始终是第一个。

Problem

我做错了什么?提前致谢。

最佳答案

据我了解您的问题,您希望在用户选择整节经文中的特定单词时突出显示整节经文。

你逻辑中的问题是你确定了用户选择的词,但那个词不一定是唯一的,所以当你搜索这个词时(使用 textView.text.range(of: detectedText) ),你会得到第一个结果,它可能是也可能不是用户实际选择的结果。

如果分词器正确理解您的文本,一个潜在的解决方案是在确定用户的选择时使用不同的 TextGranularity。而不是:

textview.tokenizer.rangeEnclosingPosition(tapPos!, with: .word, inDirection: UITextLayoutDirection.right.rawValue)

你可以试试:

textview.tokenizer.rangeEnclosingPosition(tapPos!, with: .sentence, inDirection: UITextLayoutDirection.right.rawValue)

关于swift - 使用 TextKit 突出显示单词,选择重复单词的错误出现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41594532/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com