uitextfield 左视图中的标签未与文本对齐

Posted

技术标签:

【中文标题】uitextfield 左视图中的标签未与文本对齐【英文标题】:Label in uitextfield left view not aligned with the text 【发布时间】:2018-12-07 06:18:49 【问题描述】:

我正在自定义textField,在他的左视图中带有标签,但标签的文本与textField 的文本/占位符不对齐。

这是我的简单代码:

 class mytextfield: UITextField 

    override init(frame: CGRect) 
        super.init(frame: frame)

        leftViewMode = .always
        let label = UILabel()

        label.text = "Hello"
        leftView = label
    

    required init?(coder aDecoder: NSCoder) 
        fatalError("init(coder:) has not been implemented")
    

    override func leftViewRect(forBounds bounds: CGRect) -> CGRect 
        return CGRect(x: 0, y: 0, width: 40, height: bounds.height)
    

这是模拟器上的结果(我用红色下划线来查看差异)和调试视图层次结构:

如何解决这个问题?

【问题讨论】:

我认为最快的解决方案不是设置UILabel,而是将UITextField(不可选择/可编辑)设置为leftView。这是文本容器/布局/插图的问题,如果我们将它们的机器人放在框架中对齐,则 UITextView 不完全适合 UILabel。 我不确定你的意思。要将 UITextField 设置为 UITextField 的 leftView 吗?好像有点棘手…… 哦等等,我明白你的意思了!我要试试! 有效!我认为这是解决这个问题的好方法,谢谢! 【参考方案1】:
func setLeftIconwithLabel(_ icon: UIImage) 
    
    let padding = 10
    let screenWidth = UIScreen.main.bounds.width
    let size = Int(screenWidth*0.04)
    
    let outerView = UIView(frame: CGRect(x: 0, y: 0, width: 70, height: size) )
    outerView.backgroundColor = .clear
    let iconView  = UIImageView(frame: CGRect(x: padding, y: 0, width: size, height: size))
    iconView.image = icon
    let label = UILabel(frame: CGRect(x: iconView.frame.origin.x+iconView.frame.width + 5, y: 0, width: 40, height: 15))
    label.text = "+ 965 "
    label.font = UIFont(name: fontName.ProximaNova_Regular, size: Font.regular12)
    outerView.addSubview(iconView)
    outerView.addSubview(label)
    
    leftView = outerView
    leftViewMode = .always
    


txtEmail.setLeftIconwithLabel(UIImage(named: "mobile") ?? UIImage())
txtEmail.placeholder = "Mobile Number"

【讨论】:

【参考方案2】:

你这样做:

let label = UILabel()
label.text = "Hello"
leftView = label

问题在于UILabel 的默认基线、插入布局、文本容器与UITextField 默认使用的不同。

UITextViewUILabel 之间的它们也不相同。只需检查this related question(他们也是其他人)。作者叠加了一个UITextView和一个UILabel,渲染效果不一样。

避免重复UITextField 的整个内部布局设置并将其复制到UILabel 的快速方法是将leftView 设置为UITextField。只需将其设置为“不可选择/不可编辑”,它就会产生完美的错觉。

【讨论】:

【参考方案3】:

这可能是两个视图的字体样式或框架的绑定大小呈现问题。尝试将y-positionheight 调整为左侧标签视图。

这不是您正在寻找的确切答案。但这可能会解决您的问题。

override func leftViewRect(forBounds bounds: CGRect) -> CGRect 
    return CGRect(x: 0, y: 0, width: 40, height: (bounds.height - 4))

override func leftViewRect(forBounds bounds: CGRect) -> CGRect 
    return CGRect(x: 0, y: -2, width: 40, height: bounds.height)


我试过这个:

class LeftViewTextfield: UITextField 

    override init(frame: CGRect) 
        super.init(frame: frame)

        leftViewMode = .always
        let label = UILabel()
        label.backgroundColor = UIColor.yellow
        label.text = "Hello"
        label.font = UIFont.systemFont(ofSize: 16)
        leftView = label
    

    required init?(coder aDecoder: NSCoder) 
        fatalError("init(coder:) has not been implemented")
    

    override func leftViewRect(forBounds bounds: CGRect) -> CGRect 
        return CGRect(x: 0, y: -0.5, width: 40, height: bounds.height)
    



class TestViewController: UIViewController 

    var textField: LeftViewTextfield?
    override func viewDidLoad() 
        super.viewDidLoad()

        setupTextField()
    

    func setupTextField() -> Void 
        textField = LeftViewTextfield(frame: CGRect(x: 40, y: 40, width: 100, height: 40))
        textField?.text = "Hello"
        textField?.font = UIFont.systemFont(ofSize: 16)
        textField?.backgroundColor = UIColor.orange
        self.view.addSubview(textField!)
    


结果:

【讨论】:

我刚试过,这不起作用:/矩形是对齐的,但不是文本 我认为Larme的评论是最好的适应性解决方案。 再想一想,你的回答也符合我的要求:) 您是否尝试过使用不同的大小(字体、框架)?那么插图可能会改变。 @Larme - 是的,你是对的。这个答案只是OP的一种提示类型的解决方案。他需要决定如何根据不同的字体样式和框架调整左视图。他还可以为两个视图设置调整字体样式的功能。

以上是关于uitextfield 左视图中的标签未与文本对齐的主要内容,如果未能解决你的问题,请参考以下文章

如何在 iOS 中对齐文本视图和标签中的文本

ContentControl 未与 TextBlock 中的文本对齐

当 pickerView 出现时 UITextField 中的文本向左移动

在 UITextField 中右对齐 PlaceHolder 文本

垂直菜单中的图像未与菜单容器对齐

父视图中容器视图的自动布局未与布局指南对齐