Ios 修复UITextView中修改段落间距的光标大小

Ios 修复UITextView中修改段落间距的光标大小,ios,swift,uitextview,caret,nsparagraphstyle,Ios,Swift,Uitextview,Caret,Nsparagraphstyle,我有一个自定义的可编辑UITextView,我修改了段落间距,如下所示: func layoutManager(_ layoutManager: NSLayoutManager, paragraphSpacingBeforeGlyphAt glyphIndex: Int, withProposedLineFragmentRect rect: CGRect) -> CGFloat { return 10 } func layoutManager(_ layoutManager: N

我有一个自定义的可编辑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
}
这会导致光标非常大。我试图通过覆盖
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
是错误的:

如果我打开
origin.y
,它会在正确的情况下将其打断。我不知道如何识别
origin.y
是否需要修复。我错过什么了吗

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

rect.size.height = font.pointSize - font.descender
但由于某种原因,这没有效果。有什么想法吗

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


还有什么办法解决这个问题吗?

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

我想苹果给我们提供
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
}
不过,我不知道如何修复大的选择句柄