我正在尝试为我的故事板构建可重用的视图,让我们从XIB开始:
此视图包含一个UITextField,其标签显示错误,File的所有者已连接到此类:
import Foundation
import UIKit
@IBDesignable
class TextField: UIView {
@IBOutlet weak var textField: UITextField!
@IBOutlet weak var errorLabel: UILabel!
@IBOutlet weak var errorLine: UIImageView!
var view: UIView!
func loadViewFromNib() -> UIView {
let bundle = Bundle(for: type(of: self))
let nib = UINib(nibName: "TextField", bundle: bundle)
let view = nib.instantiate(withOwner: self, options: nil)[0] as! UIView
return view
}
func xibSetup() {
view = loadViewFromNib()
view.frame = bounds
view.autoresizingMask = [UIViewAutoresizing.flexibleWidth, UIViewAutoresizing.flexibleHeight]
addSubview(view)
}
override init(frame: CGRect) {
super.init(frame: frame)
xibSetup()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
xibSetup()
}
@IBInspectable var placeholder: String? {
didSet {
textField.placeholder = placeholder
}
}
@IBInspectable var isSecureTextEntry: Bool = false {
didSet {
textField.isSecureTextEntry = isSecureTextEntry
}
}
@IBInspectable var errorText: String? {
didSet {
errorLabel.text = errorText
}
}
func showError() {
errorLine.isHidden = false
errorLabel.isHidden = false
}
func hideError() {
errorLine.isHidden = true
errorLabel.isHidden = true
}
}
然后我在Main.storyboard上使用它作为UIView,将类设置为TextField:
这里的问题是我每次使用这个TextField类时都需要为高度添加一个约束,我尝试使用instrinsic size作为Main.storyboard上的UIView的占位符(删除高度约束)但是在运行时与XIB的高度不同。
View Controller的容器视图也出现同样的问题,我遇到这种情况:
如何使容器视图与嵌入的视图控制器的高度相同? (作为测试,我将大红色视图控制器的高度设置为1500px以查看它是否滚动,如果我对容器视图的高度设置了约束,滚动视图的内容大小是正确的,但我想避免对高度的约束,我希望它是自动的)
提前感谢您提供任何帮助
答案 0 :(得分:0)
我使用了我在这里描述的相同技术: https://medium.com/zenchef-tech-and-product/how-to-visualize-reusable-xibs-in-storyboards-using-ibdesignable-c0488c7f525d#.3c0javomy
确保Xib中的所有约束定义视图的高度。 在故事板中使用它时,您不需要再次设置高度。但是,在渲染视图之前,您将在故事板中看到IB约束错误。