如果項(xiàng)目UI以xib為主,那就絕對不能錯(cuò)過 @IBInspectable @IBDesignable
厅贪。使用xib設(shè)置UI時(shí)蠢护,對于系統(tǒng)的控件,可以在Xcode右邊的 inspectors 對控件的屬性進(jìn)行設(shè)置养涮,使用 @IBInspectable
可以讓我們自定義的屬性出現(xiàn)在 inspectors 中葵硕,直接進(jìn)行復(fù)制。
extension UIView {
@IBInspectable var cornerRadius: CGFloat {
set {
self.addCornerRadius(newValue)
}
get {
return self.layer.cornerRadius
}
}
/// 添加圓角并設(shè)置masksToBounds為true
/// - Parameter cornerRadius: 圓角的值贯吓,默認(rèn)為0懈凹,不傳或者傳0,cornerRadius為高度的1/2
func addCornerRadius(_ cornerRadius:CGFloat = 0) {
if cornerRadius == 0 {
self.layer.cornerRadius = self.bounds.size.height / 2.0
} else {
self.layer.cornerRadius = cornerRadius
}
self.layer.masksToBounds = true
}
}
在xib中悄谐,很多時(shí)候一個(gè)view只需設(shè)置圓角介评,但是為了實(shí)現(xiàn)這一點(diǎn),需要一個(gè)outlet或者使用User Defined Runtime Attributes
爬舰,這個(gè)還是比較麻煩的们陆。添加了上面的extension后寒瓦,就可以像設(shè)置背景顏色那樣在 inspectors 中直接設(shè)置圓角。
設(shè)置了cornerRadius后棒掠,User Defined Runtime Attributes
會自動添加一條runtime attribute.
@IBDesignable
設(shè)置以后孵构,xcode 會嘗試直接渲染view,實(shí)現(xiàn)預(yù)覽效果烟很。
import UIKit
enum XInputItemViewStyle : Int {
case onlyTextField
case leftLabel
case titleAndLeftLabel
case leftImageView
case titleAndLeftImageView
case leftImageViewAndRightButton
}
@IBDesignable
class XInputItemView: UIView {
@IBInspectable var leading : Int = 0 {
didSet {
setNeedsLayout()
}
}
@IBInspectable var trailing : Int = 0 {
didSet {
setNeedsLayout()
}
}
@IBInspectable var textFieldLeading : Int = 0 {
didSet {
setNeedsLayout()
}
}
@IBInspectable var textFieldTrailing : Int = 0 {
didSet {
setNeedsLayout()
}
}
@IBInspectable var leftImage: UIImage? {
set {
self.leftImageView.image = newValue
}
get {
return self.leftImageView.image
}
}
@IBInspectable var rightImage: UIImage? {
set {
self.rightButton.setImage(newValue, for: .normal)
}
get {
return self.rightButton.image(for: .normal)
}
}
@IBInspectable var rightText: String? {
set {
self.rightButton.setTitle(newValue, for: .normal)
}
get {
return self.rightButton.title(for: .normal)
}
}
@IBInspectable var placeHolder: String? {
set {
self.textField.placeholder = newValue
}
get {
return self.textField.placeholder
}
}
@IBInspectable var leftText : String? {
set {
self.leftLabel.text = newValue
}
get {
return self.leftLabel.text
}
}
@IBInspectable var style : Int = 0 {
didSet {
let s : XInputItemViewStyle = XInputItemViewStyle(rawValue: self.style) ?? XInputItemViewStyle.onlyTextField
switch s {
case .onlyTextField:
self.addSubview(self.textField)
self.textField.snp.remakeConstraints { (make) in
make.left.equalTo(self.leading)
make.right.equalTo(self.trailing)
make.top.bottom.equalToSuperview()
}
case .leftImageView:
self.addSubview(self.leftImageView)
self.leftImageView.setContentHuggingPriority(UILayoutPriority.required, for: .horizontal)
self.leftImageView.snp.remakeConstraints { (make) in
make.left.equalTo(self.leading)
make.top.bottom.equalToSuperview()
}
self.addSubview(self.textField)
self.textField.snp.remakeConstraints { (make) in
make.left.equalTo(self.leftImageView.snp.right).offset(self.textFieldLeading)
make.right.equalTo(self.trailing)
make.top.bottom.equalToSuperview()
}
case .leftLabel:
self.addSubview(self.leftLabel)
self.leftLabel.setContentHuggingPriority(UILayoutPriority.required, for: .horizontal)
self.leftLabel.snp.remakeConstraints { (make) in
make.left.equalTo(self.leading)
make.top.bottom.equalToSuperview()
}
self.addSubview(self.textField)
self.textField.snp.remakeConstraints { (make) in
make.left.equalTo(self.leftLabel.snp.right).offset(self.textFieldLeading)
make.right.equalTo(self.trailing)
make.top.bottom.equalToSuperview()
}
case .leftImageViewAndRightButton:
self.addSubview(self.leftImageView)
self.leftImageView.setContentHuggingPriority(UILayoutPriority.required, for: .horizontal)
self.leftImageView.snp.remakeConstraints { (make) in
make.left.equalTo(self.leading)
make.top.bottom.equalToSuperview()
}
self.addSubview(self.textField)
self.textField.snp.remakeConstraints { (make) in
make.left.equalTo(self.leftImageView.snp.right).offset(self.textFieldLeading)
make.top.bottom.equalToSuperview()
}
self.addSubview(self.rightButton)
self.rightButton.setContentHuggingPriority(UILayoutPriority.required, for: .horizontal)
self.rightButton.snp.remakeConstraints { (make) in
make.left.equalTo(self.textField.snp.right).offset(self.textFieldTrailing)
make.right.equalTo(self.trailing)
make.top.bottom.equalToSuperview()
}
default:
self.addSubview(self.textField)
self.textField.snp.remakeConstraints { (make) in
make.left.equalTo(self.leading)
make.right.equalTo(self.trailing)
make.top.bottom.equalToSuperview()
}
}
}
}
// MARK: Lazy Init
lazy var leftImageView: UIImageView = {
let v = UIImageView()
v.contentMode = UIView.ContentMode.scaleAspectFit
return v
}()
lazy var leftLabel: UILabel = {
let v = UILabel()
v.textColor = UIColor.qd_titleText
return v
}()
lazy var topLabel: UILabel = {
let v = UILabel()
return v
}()
lazy var rightButton: UIButton = {
let v = UIButton(type: .custom)
return v
}()
lazy var textField: QMUITextField = {
let tf = QMUITextField.init()
tf.placeholderColor = UIColor.qd_background
tf.textAlignment = NSTextAlignment.left
tf.font = UIFont.systemFont(ofSize: 13)
tf.textColor = .qd_mainText
tf.tintColor = .white
return tf
}()
}