Использование selectionRects (для :) с подклассом UITextField - PullRequest
0 голосов
/ 27 сентября 2019

У меня есть подкласс UITextField, где я переопределяю прямоугольники рисования для левого вида, текста и каретки.Это делается с помощью leftViewRect(forBounds:), leftViewRect(forBounds:), caretRect(for:) и т. Д. Все работает как положено.

Проблема в том, что я перемещаю прямоугольник рисования (вверх) на -2 пункта в caretRect(for:), прямоугольник рисования для выделенного текста на 2 пункта ниже, чем должен быть.Я попытался переопределить selectionRects(for:), но UITextSelectionRect 'rect - свойство только для получения.Как правильно достичь этого?

Код

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
    }
}

1 Ответ

0 голосов
/ 27 сентября 2019

За комментарий 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
    }
}
...