博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一行代码实现headView弹簧拉伸效果
阅读量:5298 次
发布时间:2019-06-14

本文共 3028 字,大约阅读时间需要 10 分钟。

615849-20151202021052155-1190158999.gif

前言

很多app的个人中心上部的headView都实现了弹簧拉伸的效果,即tableView的top并不随着下拉而滑动,而是紧紧的停在屏幕的最上方。

我们今天就分析一下这个效果的实现方式。


分析

615849-20151202021105546-1817319641.png

关键代码

- (void)viewDidLoad {    [super viewDidLoad];    [self.view addSubview:self.tableView];        self.headView.bounds = CGRectMake(0, 0, self.tableView.bounds.size.width, 200);    self.tableView.tableHeaderView = self.headView;    self.topImageView.frame = self.headView.bounds;    [self.headView addSubview:self.topImageView];        //在viewDidLoad方法中记录原始的y和height    self.originY = self.topImageView.y;    self.originHeight = self.topImageView.height;}#pragma mark - UIScrollViewDelegate- (void)scrollViewDidScroll:(UIScrollView *)scrollView{    CGFloat offy = scrollView.contentOffset.y;    if (offy < 0) {        self.topImageView.y = offy;        self.topImageView.height = self.originHeight - offy;    }else{        self.topImageView.y = self.originY;        self.topImageView.height = self.originHeight;    }}

ok,到此你已经实现了headView的弹簧效果了!

多想一步,进一步优化

虽然上面已经实现了功能所需,但是这个效果的代码跟项目耦合在一起的,不能复用。每次实现这个效果,都要写一遍上面的代码。不能忍啊,我们进一步优化!

我们创建一个名为UIScrollView+SpringHeadView.h的UIScrollView的分类

UIScrollView+SpringHeadView类中的实现方法如下

//UIScrollView+SpringHeadView.h的内容#import 
//headView 的高度#define SpringHeadViewHeight 200@interface UIScrollView (SpringHeadView)
//在分类增加了属性,这个是利用runtime实现的@property (nonatomic, weak) UIView *topView;- (void)addSpringHeadView:(UIView *)view;@end
//UIScrollView+SpringHeadView.m的内容- (void)setTopView:(UIView *)topView{    [self willChangeValueForKey:@"SpringHeadView"];    objc_setAssociatedObject(self, &UIScrollViewSpringHeadView,                             topView,                             OBJC_ASSOCIATION_ASSIGN);    [self didChangeValueForKey:@"SpringHeadView"];}- (UIView *)topView{    return objc_getAssociatedObject(self, &UIScrollViewSpringHeadView);}- (void)addSpringHeadView:(UIView *)view{    self.contentInset = UIEdgeInsetsMake(view.bounds.size.height, 0, 0, 0);    [self addSubview:view];    view.frame = CGRectMake(0, -view.bounds.size.height, view.bounds.size.width, view.bounds.size.height);    self.topView = view;    //使用kvo监听scrollView的滚动    [self addObserver:self forKeyPath:@"contentOffset" options:NSKeyValueObservingOptionNew context:nil];}- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{    [self scrollViewDidScroll:self];}- (void)scrollViewDidScroll:(UIScrollView *)scrollView{    CGFloat offy = scrollView.contentOffset.y;        if (offy < 0) {        self.topView.frame = CGRectMake(0, offy, self.topView.bounds.size.width, -offy);    }}

现在我们使用起来爽了,只要需要引入UIScrollView+SpringHeadView.h,一行代码就能实现弹簧的效果啦!

//引入分类#import "UIScrollView+SpringHeadView.h"- (void)viewDidLoad {    [super viewDidLoad];    [self.view addSubview:self.tableView];        self.topImageView.frame = CGRectMake(0, 0, self.tableView.bounds.size.width, SpringHeadViewHeight);    //只需要一行代码,就能实现同样效果    [self.tableView addSpringHeadView:self.topImageView];}

转载于:https://www.cnblogs.com/iyou/p/5011827.html

你可能感兴趣的文章
Android UI-仿微信底部导航栏布局
查看>>
MySQL 第六天
查看>>
python 笔记一
查看>>
pip和easy_install使用方式
查看>>
博弈论
查看>>
Redis sentinel & cluster 原理分析
查看>>
我的工作习惯小结
查看>>
把word文档中的所有图片导出
查看>>
Spring 自动装配;方法注入
查看>>
浏览器的判断;
查看>>
ubuntu 18.04取消自动锁屏以及设置键盘快捷锁屏
查看>>
uva 10791
查看>>
codeforces Round #440 A Search for Pretty Integers【hash/排序】
查看>>
python的字典(dict)的键值对存储规则
查看>>
more 分页显示文件内容
查看>>
ubuntu18 tensorflow cpu fast_rcnn
查看>>
PageHelper在Mybatis中的使用
查看>>
POJ 1742 Coins
查看>>
Leetcode 589. N-ary Tree Preorder Traversal
查看>>
ADO.Net——增、删、改、查
查看>>