为什么我的自定义UITextField在Interface Builder上与在设备上运行时看起来有所不同?

时间:2019-07-12 14:58:59

标签: ios swift xcode user-interface

大家好,我有点新手。

我想子类化UITextField并添加额外的功能以创建自己的新TextField,我通过创建CALayer的新实例以创建新的下划线边框来修改TextField的边框,因此

我的文本字段正在运行,这是我的TextField在设备上运行时在InterfaceBuild VS中看起来不同的情况,如下图所示?

我尝试在prepareForInterfaceBuilder中调用setborder func,但这对我不起作用 所以我的第一个问题是我应该怎么解决这个问题?

第二个在init func和draw func中调用我的func setborder有什么区别?

TextFieldPhoto attributes inspector 预先感谢

import FontAwesome_swift

@IBDesignable
class NewUITextField: UITextField {


    override init(frame: CGRect) {
        super.init(frame: frame)
        setBorder()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        setBorder()

    }


    override func leftViewRect(forBounds bounds: CGRect) -> CGRect {

        var txtRec = super.leftViewRect(forBounds: bounds)

        txtRec.origin.x += leftPadding

        return txtRec
    }




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

        return bounds.inset(by: UIEdgeInsets(top: 0, left: 35, bottom: 0, right: 0))
    }

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

        return bounds.inset(by: UIEdgeInsets(top: 0, left: 35, bottom: 0, right: 0))
    }

    override func editingRect(forBounds bounds: CGRect) -> CGRect {
        return bounds.inset(by: UIEdgeInsets(top: 0, left: 35, bottom: 0, right: 0))
    }


    @IBInspectable  var leftPadding : CGFloat  = 0


    @IBInspectable  var borderColor :UIColor = UIColor.lightGray {

        didSet{

            setBorder()

        }
    }

    @IBInspectable  var borderWidth : CGFloat = 0.4 {

        didSet{
            setBorder()
        }
    }


    @IBInspectable  var leftImage : UIImage? {

        didSet{
            setleftImage()
        }
    }



    func setBorder()  {


        let border = CALayer()

        let width = CGFloat(self.borderWidth)


        border.borderColor =  self.borderColor.cgColor    //UIColor.lightGray.cgColor

        border.frame = CGRect(x: 0, y: self.frame.size.height - width, width: self.frame.size.width, height: self.frame.size.height)

        border.borderWidth = width

        self.borderStyle = .none

        self.layer.addSublayer(border)

        self.layer.masksToBounds = true




    }


    func setleftImage()  {

        if let img = leftImage{

            self.leftViewMode = .always

            let imgView = UIImageView(frame: CGRect(x: 0, y: 0, width: 20, height: 20))

            imgView.image = img


            imgView.contentMode = .scaleAspectFit

            imgView.tintColor = UIColor.lightGray

            self.leftView = imgView

        }
        else {

            self.leftViewMode = .never

            self.leftView = nil
        }
    }


    override func prepareForInterfaceBuilder() {
        setBorder()
    }

}



1 个答案:

答案 0 :(得分:0)

嗨,我正在界面构建器中获得预期的输出,而无需更改您提供的任何代码。

请检查附件图片Interface Image

要获得相同的信息,请检查下面的属性检查器图像是否具有最新状态,如图所示

Uptodate Attribute

如果您没有获取最新状态,请从菜单中选择编辑器->刷新所有视图 Menu selection

还请确保您已取消选择几个选项,以从编辑器->画布->显示布局矩形和显示边界矩形中查看预期的o / p
enter image description here