将 selectionRects(for:) 与 UITextField 子类一起使用
Using selectionRects(for:) with UITextField subclass
我有一个 UITextField
子类,我在其中覆盖左视图、文本和插入符号的绘图矩形。这是使用 leftViewRect(forBounds:)
、leftViewRect(forBounds:)
、caretRect(for:)
等完成的。一切都按预期进行。
问题是因为我在 caretRect(for:)
中将绘图矩形(向上)移动了 -2 点,所选文本的绘图矩形比应有的低了 2 点。我尝试覆盖 selectionRects(for:)
,但 UITextSelectionRect
的 rect
是一个只获取 属性。实现此目标的正确方法是什么?
代码
public override func selectionRects(for range: UITextRange) -> [UITextSelectionRect] {
super.selectionRects(for: range).map {
var selectionRect = [=10=]
selectionRect.rect.origin.y -= 2 // Left side of mutating operator isn't mutable: 'rect' is a get-only property
return selectionRect
}
}
根据 rmaddy 的评论和 ,我通过子类化 UITextSelectionRect
并传入来自 super.selectionRects(for: range)
的映射值和修改后的 rect
解决了这个问题。这就是我的目标:
public final class MyUITextField: UITextField {
public override func selectionRects(for range: UITextRange) -> [UITextSelectionRect] {
super.selectionRects(for: range).map {
MyTextSelectionRect(
rect: CGRect(x: [=10=].rect.origin.x, y: [=10=].rect.origin.y - 2, width: [=10=].rect.width, height: [=10=].rect.height),
writingDirection: [=10=].writingDirection,
containsStart: [=10=].containsStart,
containsEnd: [=10=].containsEnd,
isVertical: [=10=].isVertical
)
}
}
//...
}
public final class MyTextSelectionRect: UITextSelectionRect {
public override var rect: CGRect { _rect }
public override var writingDirection: NSWritingDirection { _writingDirection }
public override var containsStart: Bool { _containsStart }
public override var containsEnd: Bool { _containsEnd }
public override var isVertical: Bool { _isVertical }
private let _rect: CGRect
private let _writingDirection: NSWritingDirection
private let _containsStart: Bool
private let _containsEnd: Bool
private let _isVertical: Bool
public init(
rect: CGRect,
writingDirection: NSWritingDirection,
containsStart: Bool,
containsEnd: Bool,
isVertical: Bool
) {
_rect = rect
_writingDirection = writingDirection
_containsStart = containsStart
_containsEnd = containsEnd
_isVertical = isVertical
}
}
我有一个 UITextField
子类,我在其中覆盖左视图、文本和插入符号的绘图矩形。这是使用 leftViewRect(forBounds:)
、leftViewRect(forBounds:)
、caretRect(for:)
等完成的。一切都按预期进行。
问题是因为我在 caretRect(for:)
中将绘图矩形(向上)移动了 -2 点,所选文本的绘图矩形比应有的低了 2 点。我尝试覆盖 selectionRects(for:)
,但 UITextSelectionRect
的 rect
是一个只获取 属性。实现此目标的正确方法是什么?
代码
public override func selectionRects(for range: UITextRange) -> [UITextSelectionRect] {
super.selectionRects(for: range).map {
var selectionRect = [=10=]
selectionRect.rect.origin.y -= 2 // Left side of mutating operator isn't mutable: 'rect' is a get-only property
return selectionRect
}
}
根据 rmaddy 的评论和 UITextSelectionRect
并传入来自 super.selectionRects(for: range)
的映射值和修改后的 rect
解决了这个问题。这就是我的目标:
public final class MyUITextField: UITextField {
public override func selectionRects(for range: UITextRange) -> [UITextSelectionRect] {
super.selectionRects(for: range).map {
MyTextSelectionRect(
rect: CGRect(x: [=10=].rect.origin.x, y: [=10=].rect.origin.y - 2, width: [=10=].rect.width, height: [=10=].rect.height),
writingDirection: [=10=].writingDirection,
containsStart: [=10=].containsStart,
containsEnd: [=10=].containsEnd,
isVertical: [=10=].isVertical
)
}
}
//...
}
public final class MyTextSelectionRect: UITextSelectionRect {
public override var rect: CGRect { _rect }
public override var writingDirection: NSWritingDirection { _writingDirection }
public override var containsStart: Bool { _containsStart }
public override var containsEnd: Bool { _containsEnd }
public override var isVertical: Bool { _isVertical }
private let _rect: CGRect
private let _writingDirection: NSWritingDirection
private let _containsStart: Bool
private let _containsEnd: Bool
private let _isVertical: Bool
public init(
rect: CGRect,
writingDirection: NSWritingDirection,
containsStart: Bool,
containsEnd: Bool,
isVertical: Bool
) {
_rect = rect
_writingDirection = writingDirection
_containsStart = containsStart
_containsEnd = containsEnd
_isVertical = isVertical
}
}