swift - 将 selectionRects(for:) 与 UITextField 子类一起使用
问题描述
我有一个UITextField
子类,我在其中覆盖左视图、文本和插入符号的绘图矩形。这是使用leftViewRect(forBounds:)
, leftViewRect(forBounds:)
,caretRect(for:)
等完成的。一切都按预期工作。
问题是因为我将绘图矩形(向上)移动了 -2 个点caretRect(for:)
,所以所选文本的绘图矩形比它应该的低 2 个点。我尝试了覆盖selectionRects(for:)
,但UITextSelectionRect
'srect
是一个只能获取的属性。实现这一目标的正确方法是什么?
代码
public override func selectionRects(for range: UITextRange) -> [UITextSelectionRect] {
super.selectionRects(for: range).map {
var selectionRect = $0
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: $0.rect.origin.x, y: $0.rect.origin.y - 2, width: $0.rect.width, height: $0.rect.height),
writingDirection: $0.writingDirection,
containsStart: $0.containsStart,
containsEnd: $0.containsEnd,
isVertical: $0.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
}
}
推荐阅读
- wordpress - Woocommerce / wpml 添加不同版本的相同货币
- c - 卡住空指针和空字符串检查
- c - ac 函数在有效行为后返回零是标准的吗?
- ocaml - 四叉树迷宫中的 OCaml 寻路
- javascript - 尝试检索页面上元素的值时未定义
- grid - 选择 Dynamics CRM 网格中的所有行
- webpack - 如何使用 webpack 仅编译 LESS 文件
- javascript - 使用量角器配置为 Allure 中的多个浏览器截屏
- python - 扩展 pandas DataFrame 列中的整数范围
- performance - EF 6.2代码优先,简单查询耗时很长