iOS Swift 如何偽造一個(gè)UICollectionView的 Footer View

前言:

最近遇到一個(gè)磨人的需求狂巢。

背景:我們的首頁用的是 UICollectionView阎曹。在這個(gè)collectionview的底部昙衅,放一個(gè)FooterView,用來寫點(diǎn)提示信息歼捏。
要求:
1稿存、如果collectionview的內(nèi)容比較少(也就是說:collectionView.frame.height > collectionView.contentSize.height),那么這個(gè)FooterView就直接放到collectionview的底部瞳秽。
2瓣履、如果collectionview的內(nèi)容比較多(也就是說:collectionView.frame.height < collectionView.contentSize.height),那么這個(gè)FooterView就需要跟隨collectionview滾動(dòng)练俐。

如果是在UITableView上袖迎,我們可以這么干:

let tableView = UITableView()
tableView.tableFooterView = UIView()

但是在 UICollectionView 上,我沒有點(diǎn)出來這個(gè)footerview的屬性腺晾。這就很尷尬了燕锥。我去網(wǎng)上搜了一下,發(fā)現(xiàn)大家用的都是SectionHeader的辦法悯蝉。那這就有個(gè)問題了脯宿,SectionFooter 也是能寫的,但是在collectionview內(nèi)容比較少的時(shí)候泉粉,這個(gè)SectionFooter并不會(huì)放在collectionview的最底部,會(huì)放在屏幕中間榴芳。我家UI設(shè)計(jì)員肯定不會(huì)提意見

然后,我想了很久。決定偽造一下FooterView主籍。

Swift
代碼地址:https://github.com/gityuency/Autolayout
示例代碼類名 【FakeCollectionViewController】

示例效果

假的.gif
思路:

第一步:使用UIEdgeInsets來給collectionview底部設(shè)置一個(gè)縮進(jìn)鲤嫡。
第二步:給collectionview添加一個(gè)視圖,用來做FooterView柿祈。
第三步:在代理方法里面拿到collectionview的內(nèi)容高度哈误,給這個(gè)FooterView設(shè)置一下Frame哩至。

代碼:

import UIKit

class FakeCollectionViewController: UIViewController {
    
    @IBOutlet weak var collectionView: UICollectionView!
    
    /// 復(fù)用 ID
    let rid = "rid"
    
    /// 單元格個(gè)數(shù)
    var cellcount = 10
    
    /// FooterView的高度
    let FooterHeight: CGFloat = 60
    
    /// 記錄 collectionview 的內(nèi)容高度
    var contentHeight: CGFloat = 0
    
    /// 放在底部的View
    lazy var footerView: UIButton = {
        let b = UIButton()
        b.setTitle("點(diǎn)擊 FooterView", for: UIControl.State.normal)
        b.backgroundColor = UIColor.brown
        b.addTarget(self, action: #selector(click), for: .touchUpInside)
        return b
    }()
    
    @objc func click() {
        print("測試是否可以點(diǎn)擊")
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        if #available(iOS 11.0, *) {
            collectionView.contentInsetAdjustmentBehavior = .never
        } else {
            automaticallyAdjustsScrollViewInsets = false
        }
        
        collectionView.delegate = self
        collectionView.dataSource = self
        collectionView.register(UICollectionViewCell.self, forCellWithReuseIdentifier: rid)
        collectionView.addSubview(footerView)
        collectionView.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: FooterHeight, right: 0)
        // contentSize 是不包括 EdgeInsets的
    }
}


extension FakeCollectionViewController: UICollectionViewDataSource, UICollectionViewDelegate {
    
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return cellcount
    }
    
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: rid, for: indexPath)
        cell.backgroundColor = UIColor.orange
        return cell
    }
    
    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        
        cellcount += 10
        collectionView.reloadData()
    }
    
    // 在這個(gè)方法里面可以拿到視圖的內(nèi)容高度
    func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) {
        
        if contentHeight == collectionView.contentSize.height { //如果內(nèi)容高度沒有變化,就不需要設(shè)置footer的位置
            return
        }
        
        contentHeight = collectionView.contentSize.height
        
        if collectionView.frame.height > collectionView.contentSize.height + FooterHeight { //當(dāng)視圖的高度 比 (內(nèi)容高度 + Footer高度) 大的時(shí)候
            
            DispatchQueue.main.async {
                print("直接放到collectionview的底部: \(collectionView.contentSize.height)")
                let w = collectionView.bounds.width
                let y = collectionView.frame.height - self.FooterHeight
                self.footerView.frame = CGRect(x: 0, y: y, width: w, height: self.FooterHeight)
            }
            
        } else {
            
            DispatchQueue.main.async {
                print("根據(jù)內(nèi)容高度調(diào)整到底部: \(collectionView.contentSize.height)")
                let w = collectionView.bounds.width
                let y = collectionView.contentSize.height
                self.footerView.frame = CGRect(x: 0, y: y, width: w, height: self.FooterHeight)
            }
        }
    }
}

//if (cellcount - 1) == collectionView.indexPathsForVisibleItems.last?.row { // 這里表示要顯示最后一個(gè)cell
//}

結(jié)語:

今天八月二十一號了。我們Team換了座位蜜自。也算的上是個(gè)愜意的位置菩貌,右邊是很大飄窗,窗外是xx辦事中心重荠。好像是個(gè)歐式風(fēng)格的建筑箭阶?想想兩年前我坐在一個(gè)柱子旁邊,有種被遺棄的感覺戈鲁。


無題
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末仇参,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子婆殿,更是在濱河造成了極大的恐慌诈乒,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件婆芦,死亡現(xiàn)場離奇詭異怕磨,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)寞缝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進(jìn)店門癌压,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人荆陆,你說我怎么就攤上這事滩届。” “怎么了被啼?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵帜消,是天一觀的道長。 經(jīng)常有香客問我浓体,道長泡挺,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任命浴,我火速辦了婚禮娄猫,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘生闲。我一直安慰自己媳溺,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布碍讯。 她就那樣靜靜地躺著悬蔽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪捉兴。 梳的紋絲不亂的頭發(fā)上蝎困,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天录语,我揣著相機(jī)與錄音,去河邊找鬼禾乘。 笑死澎埠,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的盖袭。 我是一名探鬼主播失暂,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼鳄虱!你這毒婦竟也來了弟塞?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤拙已,失蹤者是張志新(化名)和其女友劉穎决记,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體倍踪,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡系宫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了建车。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片扩借。...
    茶點(diǎn)故事閱讀 39,696評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖缤至,靈堂內(nèi)的尸體忽然破棺而出潮罪,到底是詐尸還是另有隱情,我是刑警寧澤领斥,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布嫉到,位于F島的核電站,受9級特大地震影響月洛,放射性物質(zhì)發(fā)生泄漏何恶。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一嚼黔、第九天 我趴在偏房一處隱蔽的房頂上張望细层。 院中可真熱鬧,春花似錦唬涧、人聲如沸今艺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至撵彻,卻和暖如春钓株,著一層夾襖步出監(jiān)牢的瞬間实牡,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工轴合, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留创坞,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓受葛,卻偏偏與公主長得像题涨,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子总滩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評論 2 353

推薦閱讀更多精彩內(nèi)容