首先创建一个SearchView类,这个类分为上面的标题文字和下面的按钮.按钮的数量是不确定的,在将按钮添加到SearchView之前先记录下这个按钮的maxX加上横向间距的值和y值,在布局下一个按钮的时候先判断这一行余下的距离是否大于这个按钮的宽度,也就是SearchView视图的宽度减去上一个按钮的maxX加上横向间距的值是否大于这个按钮的宽度.如果大于就是说剩下的距离可以放下这个按钮,那么这个按钮的x值就是上一个按钮的maxX加上横向间距,y值与上一个按钮相同;如果小于就是说剩下的距离放不下这个按钮,那么就将这个按钮放到下一行,这个按钮的x值就是0,y值就是上一个按钮的y值加上纵向间距和按钮的高度.整个SearchView视图的高度是最后一个按钮的maxY.
class SearchView: UIView {
//标题
private let titleLabel = UILabel()
//上一个按钮的maxX加上间距
private var lastX: CGFloat = 0
//上一个按钮的y值
private var lastY: CGFloat = 35
//按钮的回调block
private var btnCallBackBlock: ((_ btn: UIButton) -> ())?
//SearchView的总高度
var searchViewHeight: CGFloat = 0
override init(frame: CGRect) {
super.init(frame: frame)
titleLabel.frame = CGRect(x: 0, y: 0, width: frame.size.width - 30, height: 35)
titleLabel.font = UIFont.systemFont(ofSize: 15)
titleLabel.textColor = UIColor(red: 140 / 255.0, green: 140 / 255.0, blue: 140 / 255.0, alpha: 1)
addSubview(titleLabel)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
convenience init(frame: CGRect, titleLabelText: String, btnTexts: [String], btnCallBackBlock: @escaping ((_ sender: UIButton) -> ())) {
self.init(frame: frame)
titleLabel.text = titleLabelText
//按钮文字的宽度
var btnW: CGFloat = 0
//按钮的高度
let btnH: CGFloat = 30
//文字与按钮两边的距离之和
let addW: CGFloat = 30
//横向间距
let marginX: CGFloat = 10
//纵向间距
let marginY: CGFloat = 10
for i in 0..<btnTexts.count {
let btn = UIButton(type: .custom)
btn.setTitle(btnTexts[i], for: .normal)
btn.setTitleColor(UIColor.black, for: .normal)
btn.titleLabel?.font = UIFont.systemFont(ofSize: 14)
btn.titleLabel?.sizeToFit()
btn.backgroundColor = UIColor.white
btn.layer.cornerRadius = 15
btn.layer.masksToBounds = true
btn.layer