【Swift】自定义UITableView可拉伸的HeadView

原创 2018年04月17日 18:15:35

效果展示

b38076f0-4f11-49df-a23a-61af365d062e.gif

代码实现

import UIKit

class RKSpringTableHeadView: UIView {

    /*
    // Only override draw() if you perform custom drawing.
    // An empty implementation adversely affects performance during animation.
    override func draw(_ rect: CGRect) {
        // Drawing code
    }
    */

    override init(frame: CGRect) {
        super.init(frame: frame)
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    var kImageViewHeight: CGFloat = 0.0

    var imageString: String? {
        didSet {
            imageView.image = UIImage.init(named: imageString!)
        }
    }

    var imageHeight: CGFloat? {
        didSet {
            kImageViewHeight = imageHeight!
            imageView.frame = CGRect(x: 0, y: 0, width: self.frame.size.width, height: imageHeight!)
        }
    }

    lazy var imageView: UIImageView = {

        let imageView = UIImageView()
        imageView.contentMode = .scaleToFill
        imageView.clipsToBounds = true
        self.addSubview(imageView)
        self.addSubview(sloganView)

        return imageView
    }()

    lazy var sloganView:UIImageView = {

        let imageView = UIImageView(image: UIImage.init(named: "bannerSlogan_Normal"))
        imageView.frame = CGRect(x: 0, y: (imageHeight! - 36) * RKConfig.kScreenScale, width: self.frame.size.width, height: (28 * RKConfig.kScreenScale))
        imageView.contentMode = .scaleAspectFit

        return imageView
    }()

    func scrollViewDidScroll(scrollView: UIScrollView) -> Void {

        let imageWidth = self.frame.size.width
        let imageOffsetY = scrollView.contentOffset.y
//        print("图片上下偏移量 imageOffsetY: \(imageOffsetY)")

        //上移
        if (imageOffsetY < 0) {

            var frame = CGRect()
            frame.origin.y = imageOffsetY
            frame.origin.x = imageOffsetY/2.0
            frame.size.width = imageWidth - imageOffsetY
            frame.size.height = (kImageViewHeight - imageOffsetY)

            imageView.frame = frame
        }
    }
}

extension UITableView {

    func rk_addSpringHeadView(view: RKSpringTableHeadView) -> Void {

        DispatchQueue.main.async {

            let emptyHeadView = UIView(frame: view.frame)
            self.tableHeaderView = emptyHeadView
            self.showsVerticalScrollIndicator = false

            self.addSubview(view)
        }
    }
}

代码调用

import UIKit

class RKHouseInfoViewController: RKBaseViewController, UITableViewDelegate, UITableViewDataSource, UIScrollViewDelegate {

    static let kHomeHousInfoCell: String = "RKHouseInfoCell"

    lazy var tableView:UITableView = {

        let tableView = UITableView()
        tableView.delegate = self
        tableView.dataSource = self
        tableView.register(UITableViewCell.self, forCellReuseIdentifier: RKHouseInfoViewController.kHomeHousInfoCell)
//        tableView.frame = self.view.frame

        return tableView
    }()

    lazy var springHeadView: RKSpringTableHeadView = {

        let headView = RKSpringTableHeadView(frame: CGRect(x: 0, y: 0, width: self.view.frame.size.width, height: 128))
        headView.imageHeight = 128
        headView.imageString = "banner_Normal"

        return headView
    }()

    lazy var searchBar:RKSearchBar = {

        let searchBar = RKSearchBar()
        searchBar.areaTitle = "苏州"
        searchBar.frame = CGRect(x: 10, y: 30, width: self.view.frame.size.width - 20, height: 44 * RKConfig.kScreenScale)

        return searchBar
    }()

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
        addConstraints()
    }

    //MARK: 添加视图约束
    func addConstraints() -> Void {

        self.view.addSubview(tableView)
        tableView.snp.makeConstraints { (make) in
            make.left.equalToSuperview().offset(0)
            make.right.equalToSuperview().offset(0)
            make.top.equalToSuperview().offset(0)
            make.bottom.equalToSuperview().offset(0)
        }

        tableView.rk_addSpringHeadView(view: springHeadView)

        self.view.addSubview(searchBar)
    }
    //MARK: TableView Delegate

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 10
    }

    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCell(withIdentifier: RKHomeViewController.kHomeHousInfoCell)
        cell?.textLabel?.text = "你好你好你好"

        return cell!
    }

    //MARK: ScrollView Delegate

    func scrollViewDidScroll(_ scrollView: UIScrollView) {

        springHeadView.scrollViewDidScroll(scrollView: scrollView)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013466880/article/details/79978708

swift中UITableView的使用(cell复用-自适应高度、headerView复用、footerView复用)

https://github.com/potato512/SYSwiftLearning 效果图 // MARK: - 数据 func setLocalData() { sel...
  • potato512
  • potato512
  • 2016-10-24 15:20:21
  • 2341

tableView中实现headView图片拉伸效果的三种解决方案

实现该效果前不得不提下backgroundView, 如下图红色部分是backgroundView 第一种方法:使用第三方自动布局的控件Masonry具体代码如下: 以backgr...
  • qq_33700174
  • qq_33700174
  • 2016-02-19 21:00:22
  • 779

Swift UITableView相关功能(六)头视图的高度

我们上一节主要讲了tableView分区以及分区的头标题和尾标题 上一节地址:http://blog.csdn.net/lwjok2007/article/details/49246613 继续使...
  • lwjok2007
  • lwjok2007
  • 2015-10-19 16:02:49
  • 3227

[iOS tableview]自定义HeadView + 复用

一般 UITableView headerView头视图的复用-(UIView*)tableView:(UITableView *)tableView viewForHeaderInSection:(...
  • iOSTianNan
  • iOSTianNan
  • 2016-12-09 14:07:14
  • 3256

UITableView+UIHeadView上控件位置不动+UIImageView 下拉放大

1.要实现这个功能之前,我们先考虑一下,一个UIImageView 随着tableView 的下拉放大,我们的第一个想到的就是UIScrollerView的代理方法,由于UITableView继承UI...
  • u011534162
  • u011534162
  • 2016-08-22 16:35:37
  • 738

iOS tableView 的headerView 可拉伸效果

需下载第三方 PathCover    http://code4app.com/ios/PathCover/53084875cb7e846c4d8b5ddd 引入 XHPathCover  XHSo...
  • liRuixuesongXueqian
  • liRuixuesongXueqian
  • 2014-12-24 15:46:22
  • 1303

swift之自定义表格控件(UITableView)

1,效果图 2、storyboard上的控件就2个:UIButton。 3、通过辅助编辑器为这2个按钮添加按钮单击事件:分别为 generalBtnClick 和   groupBtnClick ...
  • HK_5788
  • HK_5788
  • 2016-03-05 14:10:56
  • 1204

如何自定义UITableView标题

转载 - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)sec...
  • ch_soft
  • ch_soft
  • 2011-09-05 12:47:23
  • 4410

Swift 自定义UITableViewCell以及Cell的底图跟着滑动也滑动。

找工作依然不好找,还需努力才是 还是按着OC的惯性思维看过来 首先得有个tableview,然后就是实现其的代理方法语法都好说的,就看 这个里面就是咱们定义cell时所写的代码,里面也用到复用。...
  • u010095372
  • u010095372
  • 2017-02-28 17:18:56
  • 276

Swift 3.0中UITableViewCell纯代码自定义

在swift 3.0中纯代码自定义UITableViewCell的使用, 自定义cell:class CustomCell: UITableViewCell { var titleLabel:...
  • nadeal
  • nadeal
  • 2016-11-24 00:27:19
  • 7562
收藏助手
不良信息举报
您举报文章:【Swift】自定义UITableView可拉伸的HeadView
举报原因:
原因补充:

(最多只允许输入30个字)