【发布时间】:2019-07-12 14:58:59
【问题描述】:
大家好,我对 swift 有点陌生。
我想继承 UITextField 并添加额外的功能以创建我自己的新 TextField ,我通过创建一个新的 CALayer 实例来修改 TextField 的边框以创建一个新的下划线边框所以
我的文本字段出现问题,即我的 TextField 在设备上运行时在 InterfaceBuild VS 中看起来不同,如下图所示?
我尝试在 prepareForInterfaceBuilder 中调用 setborder 函数,但这对我不起作用 所以我的第一个问题是我应该怎么做才能解决这个问题?
第二个在 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()
}
}
【问题讨论】:
-
你是说边框吗?请在
Interface Builder中分享您的 textField 属性检查器。 -
@EmreCiftci 是的,我的意思是边框,我已经编辑了帖子以在 Interface Builder 中添加属性检查器
-
@EmreCiftci 感谢第一个问题已经解决了第二个问题呢?
标签: ios swift xcode user-interface