1

我需要使用文本字段让用户输入电话号码,所以我使用PhoneNumberTextField来自项目PhoneNumberKit的。

默认情况下,它只是一个无边界文本字段。我通过添加一个带有圆角半径的边框并将其UIButton添加到它的leftView. 问题是文本/占位符显示在边框上。

在此处输入图像描述

在此处输入图像描述

我尝试子类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.

在此处输入图像描述

有没有其他方法可以解决这个问题?

演示项目

4

2 回答 2

2

您需要更新您的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)
    }
}

从带有属性检查器部分的情节提要中,您可以分配左填充,例如:

在此处输入图像描述

你的结果将是:

在此处输入图像描述

来自这个答案的参考。

编辑:

是演示项目。

于 2019-02-25T09:50:29.883 回答
0

您可能可以像这样添加一些填充:

override func textRect(forBounds bounds: CGRect) -> CGRect {
    var rect = super.textRect(forBounds: bounds)
    rect.origin.x += 10
    return rect
}
于 2019-02-25T09:38:44.180 回答