Как я могу добавить вставку к тексту и заполнитель в PhoneNumberTextField - PullRequest
0 голосов
/ 25 февраля 2019

Мне нужно использовать текстовое поле, чтобы пользователь набирал телефонные номера, поэтому я использую PhoneNumberTextField из проекта PhoneNumberKit .

По умолчанию это просто текстовое поле без полей,Я изменил его, добавив границу с радиусом угла и добавив UIButton к его leftView.Проблема в том, что текст / заполнитель отображается прямо напротив границы.

enter image description here

enter image description here

Я попытался создать подкласс PhoneNumberTextField и добавить возможность вставки текста следующим образом.

@IBDesignable
class CNPhoneNumberTextField: PhoneNumberTextField {
    @IBInspectable var inset: CGFloat = 0

    override func textRect(forBounds bounds: CGRect) -> CGRect {
        return bounds.insetBy(dx: inset, dy: inset)
    }

    override func editingRect(forBounds bounds: CGRect) -> CGRect {
        return bounds.insetBy(dx: inset, dy: inset)
    }

    override func placeholderRect(forBounds bounds: CGRect) -> CGRect {
        return bounds.insetBy(dx: inset, dy: inset)
    }
}

Проблема здесь в том, что теперь он не учитывает leftView.Текст / заполнитель частично покрывается leftView.

enter image description here

Есть ли другой способ исправить это?

Демонстрационный проект

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019

Вам необходимо обновить класс CNPhoneNumberTextField, как показано ниже, где вы можете дать leftPadding для вашего textField из раскадровки.

Ваш класс будет выглядеть так:

import UIKit
import PhoneNumberKit

@IBDesignable
class CNPhoneNumberTextField: PhoneNumberTextField {

    @IBInspectable var leftPadding: CGFloat = 0

    override open func textRect(forBounds bounds: CGRect) -> CGRect {

        let padding = UIEdgeInsets(top: 0, left: leftPadding, bottom: 0, right: 0)
        return bounds.inset(by: padding)
    }

    override open func placeholderRect(forBounds bounds: CGRect) -> CGRect {

        let padding = UIEdgeInsets(top: 0, left: leftPadding, bottom: 0, right: 0)
        return bounds.inset(by: padding)
    }

    override open func editingRect(forBounds bounds: CGRect) -> CGRect {

        let padding = UIEdgeInsets(top: 0, left: leftPadding, bottom: 0, right: 0)
        return bounds.inset(by: padding)
    }
}

А из раскадровки с разделом инспектора атрибутов вы можете назначить левый отступ, например:

enter image description here

И ваш результат будет:

enter image description here

Ссылка от ЭТО ответ.

РЕДАКТИРОВАТЬ:

ЗДЕСЬ это демонстрационный проект.

0 голосов
/ 25 февраля 2019

Вы могли бы, вероятно, добавить некоторые отступы, как это:

override func textRect(forBounds bounds: CGRect) -> CGRect {
    var rect = super.textRect(forBounds: bounds)
    rect.origin.x += 10
    return rect
}
...