SnapKit 關於數組Array的擴展—— 自適應寬度、垂直、水平、九宮格布局


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM