繁体   English   中英

修复 UITextView 中修改段落间距的 cursor 大小

[英]Fix cursor size for modified paragraph spacing in UITextView

我有一个自定义的、可编辑的 UITextView,我修改了段落间距,如下所示:

func layoutManager(_ layoutManager: NSLayoutManager, paragraphSpacingBeforeGlyphAt glyphIndex: Int, withProposedLineFragmentRect rect: CGRect) -> CGFloat {
    return 10
}

func layoutManager(_ layoutManager: NSLayoutManager, paragraphSpacingAfterGlyphAt glyphIndex: Int, withProposedLineFragmentRect rect: CGRect) -> CGFloat {
    return 10
}

这导致 cursor 非常大。 我试图通过覆盖caretRect来解决这个问题:

override func caretRect(for position: UITextPosition) -> CGRect {
    let defaulCaretRect = super.caretRect(for: position)
    return CGRect(x: defaulCaretRect.origin.x, y: defaulCaretRect.origin.y, width: defaulCaretRect.width, height: 22)
}

它在某些情况下完美运行,但在其他情况下, origin.y是错误的:

错误的来源.y

如果我调整origin.y ,它会在正确的情况下破坏它。 我不知道如何识别origin.y需要修复。 我错过了什么吗?

我在这里看到了一些使用以下内容的旧答案:

rect.size.height = font.pointSize - font.descender

但是由于某种原因,这没有效果。 有任何想法吗?

最后,较大的段落间距也会导致选择句柄过大:

在此处输入图像描述

还有什么办法解决吗?

我想我已经想通了。 正如在 SO 上找到的其他问题中所建议的那样,使用字体调整插入符号的高度似乎效果很好。 缺少的是修复插入符号的原点 Y。

我认为 Apple 给我们UITextPosition一定是有原因的。 使用它,我能够获得行文本和段落文本。 有了这些,我可以检查插入符号是否在导致问题的段落的第一行。

override func caretRect(for position: UITextPosition) -> CGRect {
    var superRect = super.caretRect(for: position)
    
    guard let paragraphRange = tokenizer.rangeEnclosingPosition(position, with: .paragraph, inDirection: .storage(.backward)),
          let paragraphText = text(in: paragraphRange)else { return superRect }
    
    guard let lineRange = tokenizer.rangeEnclosingPosition(position, with: .line, inDirection: .storage(.backward)),
          let lineText = text(in: lineRange) else { return superRect }
    
    guard let font = font else { return superRect }
    
     if paragraphText.hasPrefix(lineText) {
        superRect.origin.y += 10
    }
    
    superRect.size.height = font.pointSize - font.descender
    
    return superRect
}

不过,我不知道如何修复大选择句柄。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM