向下滚动到**,稍微超过**,这是UITextView中的理想位置

时间:2017-11-01 00:33:50

标签: ios swift scroll textview

我有什么:

  • 工作代码,滚动到并突出显示包含中等冗长文档的UITextView中搜索词的下一个实例。

我想要的是什么:

  • 我不想滚动到所需的术语,使其位于TextView的最底部,而是想稍微滚动该术语,以便在视图中更好地显示。

我被困在哪里:

  • 我对Swift的概括和弱势Swift 4特别适用于Range和NSRange,所以我怀疑答案将包括捕获超出搜索词本身的一些文档(比如,接下来的200个字符中的较小者或接下来的5个换行符),我不清楚如何做到这一点。或者,如果有更好的方法可以更多地滚动视图。

代码#1 - 突出显示并找到搜索词的“this”实例:

func attributedTextHighlighting(instanceNbr: Int, searchTerm: String, inRawHaystackText: String) -> NSMutableAttributedString {

    let desiredFont = UIFont(name: "Menlo-Regular", size: self.currentDisplayFontSize)
    let fontAttribute : [NSAttributedStringKey : Any] = [NSAttributedStringKey.font: desiredFont as Any]
    let attributed = NSMutableAttributedString(string: inRawHaystackText, attributes: fontAttribute)

    if !searchTerm.isEmpty {
        do {
            let foo = NSRegularExpression.escapedPattern(for: searchTerm)
            let regex = try NSRegularExpression(pattern: foo, options: .caseInsensitive)
            var countingMatches = 0
            for match in regex.matches(in: inRawHaystackText, range: NSRange(location: 0, length: 
            inRawHaystackText.utf16.count)) as [NSTextCheckingResult] {    
                if countingMatches == instanceNbr {
                    // highlight this term green
                    attributed.addAttribute(NSAttributedStringKey.backgroundColor, value: UIColor.green, range: match.range)
                    theGreenMatchingRange = match.range
                } else {
                    // highlight this term yellow
                    attributed.addAttribute(NSAttributedStringKey.backgroundColor, value: UIColor.yellow, range: match.range)
                }
                // and either way, increment the countingMatches
                countingMatches += 1
            }
        } catch {
            fatalError("Bad RegEx! \(error)")
        }
    } else {
        print("ofSearchTerm.isEmpty = true")
    }
    return attributed
}

此代码在源文本&中查找搜索词。生成突出显示术语绿色(对于当前“查找”)或黄色(对于所有其他人)的属性文本。 此代码可以正常使用。

代码#2 - 滚动到搜索词的下一个实例

func scrollToNextMatchButtonTapped() {
    print("scrollToNextMatchButtonTapped")
    currentlyHighlightedInstance += 1
    if currentlyHighlightedInstance == numberOfInstances {
        currentlyHighlightedInstance = 0      // since numberOfInstances is 1-based but currentlyHighlightedInstance is 0-based
    }
    reloadAttribTextWithHighlighting()        // calls the above code, so the green highlight moves to the next found instance
    textDisplay.scrollRangeToVisible(theGreenMatchingRange)         // would really like to scroll to here plus a few lines (not past the end of the document, obviously)

最后一行有效(theGreenMatchingRange是在上面的代码#1中设置的全局变量,是搜索词的“this”实例的范围),但它会滚动,以便绿色突出显示的术语在窗口的最底部。

我需要添加或做什么不同以使绿色术语不在最底层?

0 个答案:

没有答案