美文网首页自己尝试等装一下iOS开发好文学学人家的框架
【一行代码快速集成tableView头部缩放视图】

【一行代码快速集成tableView头部缩放视图】

作者: 袁峥 | 来源:发表于2016-07-29 14:22 被阅读10124次

前言

很久不见,各位伙伴们,不要问我干嘛去了,我是不会告诉你们的😃,自己琢磨,废话不多说,直接切正题,应小码哥学员的要求,写了一个框架,一行代码快速集成tableView上头部视图缩放图片,并且不会占用tableView的头部视图,无侵入性,全用runtime实现的。
如果喜欢我的文章,可以关注我微博:袁峥Seemygo

Demo简介:

  • 效果图
效果图.gif

框架使用教程:

1.将YZHeaderScaleImage导入项目或者使用cocoapods导入
2.导入#import "UIScrollView+HeaderScaleImage.h"
3.使用tableView或者scrollView
4.设置了tableView头部视图,`一定记得清空头部视图背景颜色`
- (void)viewDidLoad {
    [super viewDidLoad];
   
    // 设置tableView头部缩放图片 *一行代码就集成了*
    self.tableView.yz_headerScaleImage = [UIImage imageNamed:@"header"];
    
    // 设置tableView头部视图,必须设置头部视图背景颜色为clearColor,否则会被挡住
    UIView *headerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 0, 200)];
   // 清空头部视图背景颜色
    headerView.backgroundColor = [UIColor clearColor];
    self.tableView.tableHeaderView = headerView;
   }

源码

点击这下载源代码

相关文章

网友评论

  • 我了个去111:这么往头部加按钮或label啊?老大
    我了个去111:知道了,我还以为会跟头部一起放大呢,原来不会
  • 永超超:袁老师,这个怎么加载网络图片啊
  • Zeroxhj:在category里面overwrite dealloc?这将会替换原有的dealloc里面的操作,造成一些不确定的行为。所以,swizzing下dealloc吧
  • 4f38d8742e72:神奇, ios8 崩溃的问题, 把dealloc方法注释掉就好了, 但是这样的话kvo没有移除, 然后也不会崩溃.
  • 81b0b3f1f169:感觉弄复杂了,这个效果做起来其实超简单,就一个imageView,然后更改下填充模式,然后把这个imageView放在上面,接下来就是让它的高跟着tableView的contentoff.y联动就完了
  • IIronMan:这个在ios8上有问题,赶快改吧
    3ee794e82a0d:估计没时间改,发现这个还挺方便的,不像其他的,写起来好麻烦的
  • 小微向前冲:有两个问题想请教一下
    1.集成您这个延展会挡住 MJ 上拉刷新
    2.集成您这个延展后当 push 到下一个控制器,在返回时点击任意界面会出现莫名的崩溃问题,今天测试了一天都没有找到崩溃原因,最后删除了您这个延展才不崩溃了,设置断点与打印崩溃日志也没有找出原因,还请大神给讲解下原因。
  • 暖火儿火儿:怎么设置网络图片?求解,在线等
  • Nlinger:iOS 8的问题OK了么?我也正想用这个方法呢,大神们,解答下 :smile:
  • d58b0834e4d3:按照你的步骤集成使用,功能实现了,但是有个问题,返回会挂。
  • Ko_Neko:你好,在UIScrollView的分类文件中,以下方法的最后
    + (void)yz_swizzleClassSelector:(SEL)origSelector swizzleSelector:(SEL)swizzleSelector{

    // 添加原有方法实现为当前方法实现
    BOOL isAdd = class_addMethod(self, origSelector, method_getImplementation(swizzleMethod), method_getTypeEncoding(swizzleMethod));

    if (!isAdd) { // 添加方法失败,原有方法存在,直接替换
    method_exchangeImplementations(origMethod, swizzleMethod);
    }
    这里是不是缺少了一个else {
    //虽然添加成功,但是SEL*swizzle指向的也是swizzleMethod,需要让SEL*swizzle指向origMethod
    class_replaceMethod(self, swizzleSelector, method_getImplementation(origMethod), method_getTypeEncoding(origMethod));
    }
    }

    如果不需要,可以解释以下为什么吗。如果添加成功不需要将Swizzling的SEL指针指向origin的IMP吗
  • CepheusSun:就是重写了dealloc方法,导致的问题。。。
  • CepheusSun:我也遇到了
  • iOSPeter:同上:[UITableViewWrapperView _systemGestureStateChanged:]: message sent to deallocated instance 0x17045090
    发生在iOS8系统上。希望早点修复
  • 涂川iOS:峥哥,被这个问题困扰了四天[UITableViewWrapperView _systemGestureStateChanged:]: message sent to deallocated instance 0x17045090,试了无数方法,没有解决,大坑啊...
    男神nick:@涂川
  • 修行猿:1.发现app中任何的uitableview被释放之后,再点击屏幕就会crash,报
    [UITableView _systemGestureStateChanged:]: message sent to deallocated instance 0x17385200
    2.后来发现任何的collectionview被释放之后,点击屏幕也会crash,报
    [UICollectionView _systemGestureStateChanged:]: message sent to deallocated instance 0x17385200
    3.把目光放在UIScrollView上,查找UIScrollView的分类,是否有问题
    4.找到 UIScrollView+HeaderScaleImage.h 注释了其中一部分代码,并把所有的引用都注释掉,依然有这个问题。
    5.开始将目光放在_systemGestureStateChanged上,还有僵尸对象上,用instrument调试,依然无解。
    6.六个小时过去了。
    7.睡了一觉,然后又把目光放在UIScrollView上,将UIScrollView+HeaderScaleImage.h 中的代码全部注释掉了。
    8.正常。感觉世界都亮了。
    9.一步一步注释,排除,最后发现这个里面重写了uiscrollview的dealloc方法,导致scrollview在释放的时候无法清除自己的观察者身份,导致系统发通知的时候仍然能发到它身上。ios 9 没问题,ios8上就会直接crash。
    10.将最后那个dealloc中的代码另外立出来,在controller的dealloc中主动调用这个方法,整个app没几个页面用这个,所以也并没有增加太多的工作量。
    11.大哥啊..坑死了·.·|| 赶快更新一下或者说明一下,你这个会导致全局出错,不是局部。
    男神nick:正解 这个问题困扰我快俩星期了 :joy:
    fleeming:正解,,,找了这个原因找好久
    01665d16b338:@六道真君 正解,就是这样的,坑得眼睛水就出来了 :joy:
  • 734d9cf44cc9:[UITableView _systemGestureStateChanged:]: message sent to deallocated instance 0x17385200
    这是什么问题?
  • 3601593ca2de:峥哥,iOS9以下会崩溃啊?怎么解决,着急,在线等!!!!!!!!!!!!!!
    广益散人:@袁峥Seemygo 确实是会崩溃,我在ios8的系统上跑,只要有点击事件就会崩溃,打全局模式后发现是你用了swizzer的那个方法导致的。
    袁峥:@哈哈奎奎 有技术问题交流的话,最好能给我一个可以重现的小Demo,方便我调试。
    袁峥:@哈哈奎奎 什么错误
  • 骑着蜗牛追阳光:不懂OC,有没有swift的代码😊
  • 广益散人:想在这个基础上添加轮播图片 请问该怎么做
    袁峥:@DariusZhu 自己写个view 作为tableview头部视图
  • liangdahong: :pray: 博主辛苦,我在github提了一个问题,求关注。https://github.com/iThinkerYZ/YZHeaderScaleImage/issues/1
    :joy: 如果方便给我推荐一片博客:http://www.jianshu.com/p/cc1b6aa854eb
    袁峥:@Dared 嗯嗯 这个应该改进
  • 昵称glh:9.0以下会造成崩落
    DanielTse:我也遇到了这种崩溃 用户手机iOS8.0,iOS8.1,iOS8.3系统,会崩溃
    [UIScrollView _systemGestureStateChanged:]: message sent to deallocated instance 0x170a6000

    [UITableView _systemGestureStateChanged:]: message sent to deallocated instance 0x17385200

    猜测:UIScrollView分类里的代码导致的,希望给出解决办法。看到消息请回复一下,非常感谢。
    昵称glh:@峥吖 [UITableViewWrapperView _systemGestureStateChanged:]: message sent to deallocated instance 0x787cc840
    袁峥:@_少爷_ 能把错误发我吗
  • 听哥说心里话:// 拦截通过代码设置tableView头部视图
    - (void)setYz_TableHeaderView:(UIView *)tableHeaderView
    {

    // 不是UITableView,就不需要做下面的事情
    if (![self isMemberOfClass:[UITableView class]]) return;

    // 设置tableView头部视图
    [self setYz_TableHeaderView:tableHeaderView];

    // 设置头部视图的位置
    UITableView *tableView = (UITableView *)self;

    self.yz_headerScaleImageHeight = tableView.tableHeaderView.frame.size.height;

    }
    峥哥,这个代码为什么打断点进不去,自己调自己不会出现循环引用吗?求解释。谢谢
    听哥说心里话:@峥吖 但是运行时已经实现了方法交换,又吊用了那个方法,为啥跳到自己实现的方法呢?
    听哥说心里话:@峥吖 哦哦,谢谢啊
    袁峥:@男书虫 这个我留着 扩展 暂时不需要管
  • Criss_Cheng:能不能支持一下 collectionView 啊~
    袁峥:@Criss_Cheng collectionView应该可以 你试试
  • 兵哥神哥:峥哥!我在猛犸这边听的视频!我感觉就你讲的最好了!这个猛犸有点失望!天天听视频!还搞什么编程大赛!导致我们课程比盛达都落下好多了
  • 阿瑞1995:demo 里面没有 project 文件 没法运行啊
  • e1e69252eee1:永远都是干货满满
  • KXuan:峥哥,我想问一下,想你这种把自已写好的分类变成一个框架,是不是就是所谓的CocoaPods封装私有库??
    袁峥:@KXuan 不是 私有库 是不开源的 你喜欢打包静态库
  • b470b9fc7145:峥哥,你的这个会挡住 MJRefresh
    ```
    //
    // ViewController.m
    // testHeader
    //
    // Created by 陈博文 on 16/7/30.
    // Copyright © 2016年 陈博文. All rights reserved.
    //

    #import "ViewController.h"
    #import "UIScrollView+HeaderScaleImage.h"
    #import <MJRefresh.h>

    @interface ViewController ()
    /** tableView*/
    @property (nonatomic ,weak) UITableView *tableView;

    @EnD

    @Implementation ViewController

    - (void)viewDidLoad {
    [super viewDidLoad];

    UITableView *tableView = [[UITableView alloc]init];
    tableView.frame = self.view.bounds;
    [self.view addSubview:tableView];
    self.tableView = tableView;

    // 设置tableView头部缩放图片 *一行代码就集成了*
    self.tableView.yz_headerScaleImage = [UIImage imageNamed:@"header"];

    // 设置tableView头部视图,必须设置头部视图背景颜色为clearColor,否则会被挡住
    UIView *headerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 0, 200)];
    // 清空头部视图背景颜色
    headerView.backgroundColor = [UIColor clearColor];
    self.tableView.tableHeaderView = headerView;

    self.tableView.mj_header = [MJRefreshNormalHeader headerWithRefreshingTarget:self refreshingAction:@selector(loadData)];



    }


    - (void)loadData{


    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

    [self.tableView.mj_header endRefreshing];

    });

    }
    ```
    袁峥:@年小羊 好的 中午我修改下
  • b470b9fc7145:demo 里面没有 project 文件
  • 涂川iOS:峥哥:+1::+1:
  • 蚂蚁牙齿不黑:不问也知道把妹去了
    重新天空之城:楼主是嫩模,网红杀死!!!

本文标题:【一行代码快速集成tableView头部缩放视图】

本文链接:https://www.haomeiwen.com/subject/hajzjttx.html