1、自定义UICollectionViewFlowLayout
swift代码 oc 对应的转换一下即可
import UIKit
class BLEvaluationCollectionViewLayout: UICollectionViewFlowLayout {
override func prepare() {
super.prepare()
self.minimumLineSpacing = 15
self.minimumInteritemSpacing = 10
}
override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
let attributes:[UICollectionViewLayoutAttributes] = super.layoutAttributesForElements(in: rect)!
let maxiMumSpace:CGFloat = self.minimumLineSpacing
for index in 0 ..< attributes.count {
if index == 0 {
let att = attributes[0]
att.frame.origin.x = 20
continue
}
let currentAtt = attributes[index]
let preAtt = attributes[index - 1]
if preAtt.indexPath.section == currentAtt.indexPath.section {
let orgin:CGFloat = CGFloat(preAtt.frame.maxX)
if currentAtt.frame.minY == preAtt.frame.minY {///在同一行
if orgin + maxiMumSpace + currentAtt.frame.size.width <= self.collectionViewContentSize.width - 40 {
var frame:CGRect = currentAtt.frame
frame.origin.x = orgin + maxiMumSpace
currentAtt.frame = frame
}
}else{
var frame:CGRect = currentAtt.frame
let zeroAtt = attributes[0]
frame.origin.x = zeroAtt.frame.origin.x
currentAtt.frame = frame
}
}
}
return attributes
}
}
2、在collectionview 初始化位置设置 layout (BLEvaluationCollectionViewLayout)
懒加载
private lazy var collectionView:UICollectionView = {
var layout = BLEvaluationCollectionViewLayout()
layout.minimumLineSpacing = 15
layout.minimumInteritemSpacing = 10
let collectionView:UICollectionView = UICollectionView(frame: CGRect.zero, collectionViewLayout: layout)
collectionView.delegate = self
collectionView.dataSource = self
collectionView.backgroundColor = .white
view.addSubview(collectionView)
return collectionView
}()
3、对应的代理方法返回相应的size
我的字体是12 根据需求修改
也可以封装此方法
class func getSizeWithText(text:String) -> CGSize {
let style = NSMutableParagraphStyle.init()
style.lineBreakMode = NSLineBreakMode.byCharWrapping
let size:CGSize = text.boundingRect(with: CGSize.init(width: CGFloat.greatestFiniteMagnitude, height: 30), options: .usesLineFragmentOrigin, attributes:
[NSAttributedString.Key.font:UIFont.systemFont(ofSize: 12) ,NSAttributedString.Key.paragraphStyle:style], context: nil).size
return CGSize.init(width: size.width + 20, height: 30)
}
代理方法 item 大小
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
return getSizeWithText(text: dataSource[indexPath.row])
}
完事
网友评论