https://blog.csdn.net/zn_echonn/article/details/80395156
SnapKit 關於數組Array的擴展—— 自適應寬度、垂直、水平、九宮格布局
前言
用SnapKit這個第三方寫自動布局,使用起來的確很舒服,但是對於Array卻沒有相關的支持,然后在網上找了這篇文 SnapKit的擴展–添加數組控制約束,和九宮格布局,等寬,等間距等布局方式 ,感謝
但是只有水平、垂直、九宮格布局,如果我想讓多個button,按它的title的內容的寬度自適應排列呢,所以,決定自己寫個擴展,參考了上面那篇文的代碼,並做了一些修改。
其具體實現及Demo代碼如下: Github 地址
https://github.com/ning-echonn/SnapKitExtensionDemo
僅供參考,希望有所幫助,如果你有什么好的方式,請告知,感謝。
以下為展示的效果例子及說明:
自適應寬度布局
public func distributeDetermineWidthViews(verticalSpacing: CGFloat,
horizontalSpacing: CGFloat,
maxWidth: CGFloat,
determineWidths: [CGFloat],
itemHeight: CGFloat,
edgeInset: UIEdgeInsets = UIEdgeInsets.zero,
topConstrainView: ConstraintView? = nil)
// verticalSpacing 每個view之間的垂直距離
// horizontalSpacing 每個view之間的水平距離
// maxWidth 是整個布局的最大寬度,需要事前傳入,比如 self.view.bounds.size.width - 40
// textWidth 是每個view的寬度,也需事前計算好
// itemHeight 每個view的高度
// edgeInset 整個布局的 上下左右邊距,默認為 .zero
// topConstrainView 整個布局之上的view, 從topConstrainView.snp.bottom開始計算,
// 比如,傳入上面的label,則從 label.snp.bottom + edgeInset.top 開始排列, 默認為nil, 此時布局從 superview.snp.top + edgeInset.top 開始計算
btnArr.snp.distributeDetermineWidthViews(verticalSpacing: 20, horizontalSpacing: 10, maxWidth: self.view.bounds.size.width - 40, determineWidths: textWidth, itemHeight: 30, edgeInset: UIEdgeInsetsMake(20, 20, 0, 20), topConstrainView: label)
雖然說是自適應寬度,但是一開始需要自己計算每個view的寬度再傳入,而且還得傳最大寬度QUQ,但是除了這樣,我也不知道怎么做比較好了,如果你知道,求告知。
九宮格布局
public func distributeSudokuViews(verticalSpacing: CGFloat,
horizontalSpacing: CGFloat,
warpCount: Int,
edgeInset: UIEdgeInsets = UIEdgeInsets.zero,
itemHeight: CGFloat? = nil,
topConstrainView: ConstraintView? = nil)
第一個九宮格分布:
黃色為所有view的容器,每個view之間的邊距(垂直/水平)固定,高度未知,那么其實際高度與view的容器高度有關
// verticalSpacing 每個view之間的垂直距離
// horizontalSpacing 每個view之間的水平距離
// warpCount 每行多少列
// edgeInset 整個布局的 上下左右邊距,默認為 .zero
// itemHeight 每個view的高度, 默認為 nil,可以不指定,那么每個view的高度就按整個容器的高度來確定
// topConstrainView 整個布局之上的view, 從topConstrainView.snp.bottom開始計算,
// 比如,傳入上面的label,則從 label.snp.bottom + edgeInset.top 開始排列, 默認為nil, 此時布局從 superview.snp.top + edgeInset.top 開始計算
views.snp.distributeSudokuViews(verticalSpacing: 10, horizontalSpacing: 30, warpCount: 3, edgeInset: UIEdgeInsetsMake(10, 10, 10, 10), itemHeight: nil, topConstrainView: label)
第二個九宮格分布:
橙色為所有view的容器,這個例子,高度確定,那么與容器的高度無關
// itemHeight 每個view的高度指定
views.snp.distributeSudokuViews(verticalSpacing: 10, horizontalSpacing: 30, warpCount: 3, edgeInset: UIEdgeInsetsMake(10, 10, 10, 10), itemHeight: 20, topConstrainView: label)
垂直布局
第一個垂直分布的例子,指定了按鈕的高度(fixedItemLength),即每個按鈕的高度都相等
// axisType 垂直或水平
// fixedItemSpacing 每個view之間的距離
// edgeInset 整個布局的 上下左右邊距,默認為 .zero
// fixedItemLength 垂直時,是每個view的固定高度, 默認為 nil, 可不傳,不傳的例子見下面
// topConstrainView 整個布局之上的view, 從topConstrainView.snp.bottom開始計算,
// 比如,傳入上面的label,則從 label.snp.bottom + edgeInset.top 開始排列, 默認為nil, 此時布局從 superview.snp.top + edgeInset.top 開始計算
btnArr.snp.distributeViewsAlong(axisType: .vertical, fixedItemSpacing: 20, edgeInset: UIEdgeInsetsMake(10, 40, 0, 40), fixedItemLength: 30, topConstrainView: label)
當然,如果你想讓它每個button的寬度不一樣也可以(默認水平居中,即CenterX與superview一樣),可以遍歷一遍對每個button做如下操作
btn.snp.makeConstraints({ (make) in
make.width.equalTo((i + 1) * 40)
})
或者
btnArr.snp.makeConstraints { (make) in
make.width.equalTo(60)
}
第二垂直分布的例子,不設置固定高度 fixedItemLength,那么隨便你設置高度和寬度唄
// fixedItemLength 為nil 時, 可為每個view設置寬高,
// 當然,也可以不設置寬度,但是對高度一些可以不設置,比如label、button
btnArr.snp.distributeViewsAlong(axisType: .vertical, fixedItemSpacing: 30, edgeInset: UIEdgeInsetsMake(360, 20, 0, 20))
同理,遍歷一遍對每個button做如下操作
btn.snp.makeConstraints({ (make) in
make.height.equalTo((i + 1) * 20)
make.width.equalTo((i + 1) * 40)
})
或
btnArr.snp.makeConstraints { (make) in
make.height.equalTo(30)
make.width.equalTo(60)
}
水平布局
跟垂直分布一樣,只是垂直參數,換成了水平
第一個例子,設置fixedItemLength,固定寬度,但是高度還是可以設置
// fixedItemLength 水平時,是每個view的固定寬度, 默認為 nil, 可不傳,不傳的例子見下面
btnArr.snp.distributeViewsAlong(axisType: .horizontal, fixedItemSpacing: 20, edgeInset: UIEdgeInsetsMake(10, 20, 0, 20), fixedItemLength: 70, topConstrainView: label)
同理,遍歷一遍對每個button做如下操作
btn.snp.makeConstraints({ (make) in
make.height.equalTo((i + 1) * 20)
})
或者
btnArr.snp.makeConstraints { (make) in
make.height.equalTo(60)
}
第二個例子,不設置固定寬度 fixedItemLength,那么隨便你設置高度和寬度唄
// fixedItemLength 為nil 時, 可為每個view設置寬高,
// 當然,也可以不設置寬度,但是對高度一些可以不設置,比如label、button
btnArr.snp.distributeViewsAlong(axisType: .horizontal, fixedItemSpacing: 20, edgeInset: UIEdgeInsetsMake(360, 20, 0, 20))
————————————————
版權聲明:本文為CSDN博主「西瓜皮炒雞蛋」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/zn_echonn/article/details/80395156