gpt4 book ai didi

swift - Swift 中 UITextView 文本的结尾

转载 作者:行者123 更新时间:2023-11-30 13:30:08 24 4
gpt4 key购买 nike

我试图检测用户何时到达文本中的某个点:UITextView 中的字符串。我正在使用 scrollViewDidEndDragging 但结果并不理想。当我完成滚动后,我仍然需要进一步滚动才能实现它。另外,当文本只有 1 页长时,永远不会调用此方法。有没有更好的方法来知道最后一行(或任何其他行)何时对屏幕可见?谢谢

func scrollViewDidEndDragging(scrollView: UIScrollView, willDecelerate decelerate: Bool) {
let bottomEdge: CGFloat = textField.contentOffset.y + textField.frame.size.height
if (bottomEdge >= scrollView.contentSize.height) {
//do stuff
}
}

最佳答案

这是一个简单的解决方案,它获取子字符串的矩形并检查该矩形是否可见。

此实现的主要缺点是,它仅在子字符串唯一时才有效(因为它只获取第一次出现的情况)。但这应该不会太糟糕而难以实现(也许使用您检查的矩形数组)。

UITextView 助手

我已在 UITextView 上创建了扩展程序为了方便。它提供了两种方法:一种用于确定子字符串的矩形,另一种用于检查该矩形是否可见。

rectForText相当冗长,主要是因为 Range<Index> 的转换进入UITextRange事实证明这比预想的更痛苦。如果有人知道更简单的方法请分享。

extension UITextView {
func rectForText(targetText: String) -> CGRect? {
if let range = text.rangeOfString(targetText) {
let beginning = beginningOfDocument
let startOffset = text.startIndex.distanceTo(range.startIndex)
if let start = positionFromPosition(beginning, offset: startOffset) {
let endOffset = text.startIndex.distanceTo(range.endIndex) - startOffset
if let end = positionFromPosition(start, offset: endOffset) {
if let textRange = textRangeFromPosition(start, toPosition: end) {
return firstRectForRange(textRange)
}
}
}
}

return nil
}

func isRectVisible(rect: CGRect?) -> Bool {
if let rect = rect {
return CGRectIntersectsRect(rect, bounds)
}

return false
}
}

测试代码

最后,我创建了一个简单的测试项目,其中有一个带有单个 TextView 的 View Controller 。请注意,它会在 View 出现时检查一次可见性,然后在 ScrollView 滚动时连续检查可见性。我还缓存了测试矩形,以避免每次滚动时重新计算它。但如果您的文本是动态的,那么您将必须重新计算。

class ViewController: UIViewController, UITextViewDelegate {
@IBOutlet weak var myTextView: UITextView!
var rectOfString: CGRect?

override func viewDidLoad() {
super.viewDidLoad()

myTextView.delegate = self
myTextView.text = "foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar My cool substring foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar "
rectOfString = myTextView.rectForText("My cool substring")
}

override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)

checkTextVisibility()
}

private func checkTextVisibility() {
if myTextView.isRectVisible(rectOfString) {
print("Visible :)")
} else {
print("Not visible :(")
}
}
}

extension ViewController: UIScrollViewDelegate {
func scrollViewDidScroll(scrollView: UIScrollView) {
checkTextVisibility()
}
}

关于swift - Swift 中 UITextView 文本的结尾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36658948/

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