UITableView 實現(xiàn)無限下拉(背景跟隨放大)

現(xiàn)在大多數(shù)App都有這種效果,實現(xiàn)原理大同小異。都是監(jiān)聽UITableView scrollViewDidScroll 方法去動態(tài)改變header frame。

QQ20180505-212023-HD.gif

1.懶加載定義UITableView

    lazy var tableview:UITableView = {
       var mytable = UITableView.init(frame: CGRect.init(x: 0, y: 0, width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height), style: .grouped)
        mytable.register(UITableViewCell.self, forCellReuseIdentifier: "cell")
        mytable.delegate = self
        mytable.dataSource = self
        return mytable
    }()

2.定義Header 背景圖片

    lazy var headerView:UIImageView = {
        var header:UIImageView = UIImageView.init(frame: CGRect.init(x: 0, y: 0, width: UIScreen.main.bounds.width, height: 300))
        header.image = UIImage.init(named: "headbg")
        header.contentMode = .scaleAspectFill
        header.backgroundColor = UIColor.red
        return header
    }()

3. 給 tableHeaderView創(chuàng)建view視圖

    override func viewDidLoad() {
        super.viewDidLoad()
        //自定義view 頭像/登錄/注冊 按鈕都可以放在上面
        let back:UIView = UIView.init(frame: CGRect.init(x: 0, y: 0, width: UIScreen.main.bounds.width, height: 300))
        back.backgroundColor = UIColor.green
        back.addSubview(headerView)
        self.tableview.tableHeaderView = back
        self.view.addSubview(self.tableview)
        // Do any additional setup after loading the view.
    }

4.創(chuàng)建監(jiān)聽scrollViewDidScroll

    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        //照片寬度
        let width = self.view.frame.size.width
        //偏移量y
        let yoffset = scrollView.contentOffset.y
        if yoffset<0 {
            let totalOffset = 300 + abs(yoffset)
            let f = totalOffset/300 //計算縮放比例
            self.headerView.frame = CGRect.init(x: -(width*f-width), y: yoffset, width: width*f, height: totalOffset)
        }
    }

上例是UIViewController 沒有 UINavigationBar 的情況。如果有UINavigationBar 可將navigationbar 設置成透明 然后 適當設置 uitableview contentOffset,讓uitableview 在 navigationbar下面。

override func viewWillAppear(_ animated: Bool) {
        //1.判斷登錄狀態(tài),load data
        //2.設置透明
        self.navigationController?.navigationBar.isTranslucent = true
  self.navigationController?.navigationBar.setBackgroundImage(UIImage.init(), for: .default)
        self.navigationController?.navigationBar.shadowImage = UIImage.init()
        self.navigationController?.navigationBar.barStyle = .blackTranslucent
    }

取消透明

    override func viewWillDisappear(_ animated: Bool) {
        self.navigationController?.navigationBar.setBackgroundImage(nil, for: .default)
        self.navigationController?.navigationBar.shadowImage = nil
        self.navigationController?.navigationBar.barStyle = .default
        self.navigationController?.navigationBar.isTranslucent = false
    }

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容