現(xiàn)在大多數(shù)App都有這種效果,實(shí)現(xiàn)原理大同小異查邢。都是監(jiān)聽(tīng)UITableView scrollViewDidScroll
方法去動(dòng)態(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 頭像/登錄/注冊(cè) 按鈕都可以放在上面
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)聽(tīng)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 //計(jì)算縮放比例
self.headerView.frame = CGRect.init(x: -(width*f-width), y: yoffset, width: width*f, height: totalOffset)
}
}
上例是UIViewController 沒(méi)有 UINavigationBar 的情況。如果有UINavigationBar 可將navigationbar 設(shè)置成透明 然后 適當(dāng)設(shè)置 uitableview contentOffset
,讓uitableview 在 navigationbar下面众旗。
override func viewWillAppear(_ animated: Bool) {
//1.判斷登錄狀態(tài)踱侣,load data
//2.設(shè)置透明
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
}