1.下拉刷新控件

2.下拉加载更多控件

下拉刷新控件

@property(nonatomic,strong) VRefreshHeadView *vrefresh;

[self vrefresh];

-(VRefreshHeadView *)vrefresh{

__weak typeof(self) weakSelf = self;

if (!_vrefresh) {

_vrefresh=[[VRefreshHeadView alloc] initWithScrollView:weakSelf.tbView beginRefreshBlock:^(VRefreshHeadView *vrefresh) {

NSLog(@"进入刷新回调");

[self performSelector:@selector(endVrefresh) withObject:nil afterDelay:3.0f];

}];

}

return _vrefresh;

}

-(void)endVrefresh{

[_vrefresh endRefresh];

}

//

//  VRefreshHeadView.h

//  下拉刷新控件

//

//  Created by Vie on 2016/10/10.

//  Copyright © 2016年 Vie. All rights reserved.

//

#import <UIKit/UIKit.h>

typedef NS_ENUM(NSUInteger, VRefreshType) {

VRefreshTypeDefault = 0,//默认下拉刷新样式

};

@interface VRefreshHeadView : UIView

typedef void (^beginRefreshBlock) (VRefreshHeadView *vrefresh);//刷新事件回调

@property(nonatomic,assign) NSUInteger type;//刷新视图样式

/**

创建下拉刷新视图

@param scrollView        滚动视图

@param beginRefreshBlock 开始刷新回调

@return 刷新视图对象

*/

-(instancetype)initWithScrollView:(UIScrollView *)scrollView beginRefreshBlock:(beginRefreshBlock)beginRefreshBlock;

//停止刷新

-(void)endRefresh;

@end

//

//  VRefreshHeadView.m

//  下拉刷新控件

//

//  Created by Vie on 2016/10/10.

//  Copyright © 2016年 Vie. All rights reserved.

//

#import "VRefreshHeadView.h"

#define vRefreshHeadViewHeight 40

#define navBarHeight  64  //竖屏导航栏和控制器高度(竖屏导航栏高度44,竖屏状态栏高度为20、打电话或者某些情况为40)

@interface VRefreshHeadView ()

@property (nonatomic,copy) beginRefreshBlock beginRefreshBlock;

@property(nonatomic,weak) UIScrollView *scrollView;

/**

*头部提示语

*/

@property(nonatomic,weak) UILabel *headTipLable;

/**

*  加载提示

*/

@property (nonatomic, weak) UIActivityIndicatorView *indicatorView;

/**

*是否处于刷新状态

*/

@property(nonatomic,assign) BOOL isRefresh;

@end

@implementation VRefreshHeadView

#pragma mark  - init方法

-(instancetype)initWithScrollView:(UIScrollView *)scrollView beginRefreshBlock:(beginRefreshBlock)beginRefreshBlock{

self=[super initWithFrame:CGRectMake(0, -vRefreshHeadViewHeight, scrollView.frame.size.width, vRefreshHeadViewHeight)];

if (self) {

_scrollView=scrollView;

_beginRefreshBlock=beginRefreshBlock;

//把当前视图加载到scrollView的UI

[_scrollView addSubview:self];

//设置背景颜色

self.backgroundColor=[UIColor clearColor];

//默认不在刷新状态

self.isRefresh=false;

//注册观察者,监听下拉刷新改变

[_scrollView addObserver:self forKeyPath:@"contentOffset" options:NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew context:nil];

}

return self;

}

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context{

if ([keyPath isEqualToString:@"contentOffset"]) {

if (_scrollView.contentOffset.y<(-navBarHeight-vRefreshHeadViewHeight)&&!self.isRefresh&&_scrollView.dragging) {

[self.indicatorView startAnimating];

self.isRefresh=true;

self.headTipLable.text=@"加载中..";

_scrollView.contentInset = UIEdgeInsetsMake(vRefreshHeadViewHeight+navBarHeight, 0, 0, 0);

if (_beginRefreshBlock) {

_beginRefreshBlock(self);

}

}

}

}

//停止刷新

-(void)endRefresh{

[UIView  animateWithDuration:0.3 animations:^{

//        _scrollView.contentInset = UIEdgeInsetsZero;

_scrollView.contentInset = UIEdgeInsetsMake(navBarHeight, 0, 0, 0);

} completion:^(BOOL finished) {

[self.indicatorView stopAnimating];

self.isRefresh=false;

_headTipLable.text=@"下拉刷新数据";

}];

}

/*

// Only override drawRect: if you perform custom drawing.

// An empty implementation adversely affects performance during animation.

*/

- (void)drawRect:(CGRect)rect {

// Drawing code

if (_type) {

}else{

//没有指定type用默认视图

[self setDefaultView];

}

}

//默认样式

-(void)setDefaultView{

[self headTipLable];

}

#pragma mark - 懒加载创建控件

- (UIActivityIndicatorView *)indicatorView

{

if (!_indicatorView)

{

UIActivityIndicatorView *act = [[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(50, 0, 30, self.frame.size.height)];

act.color = [UIColor grayColor];

[self addSubview:act];

_indicatorView = act;

}

return _indicatorView;

}

-(UILabel *)headTipLable{

if (!_headTipLable) {

UILabel *lb = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, self.frame.size.width,self.frame.size.height)];

lb.textAlignment = NSTextAlignmentCenter;

lb.textColor = [UIColor grayColor];

lb.font = [UIFont systemFontOfSize:13];

lb.text = @"下拉刷新数据";

[self addSubview:lb];

_headTipLable = lb;

}

return _headTipLable;

}

-(void)dealloc{

[_scrollView removeObserver:self forKeyPath:@"contentOffset"];

}

@end

下拉加载更多控件

@property(nonatomic,strong) VLoadMoreFootView *vload;

[self vload];

-(VLoadMoreFootView *)vload{

__weak typeof(self) weakSelf=self;

if (!_vload) {

_vload=[[VLoadMoreFootView alloc] initWithScrollView:weakSelf.tbView beginLoadMoreBlock:^(VLoadMoreFootView *vrefresh) {

NSLog(@"进入上拉加载");

[self performSelector:@selector(endVload) withObject:nil afterDelay:3.0f];

}];

}

return _vload;

}

-(void)endVload{

[_vload endLoadMore];

}

//

//  VLoadMoreFootView.h

//  上拉加载更多控件

//

//  Created by Vie on 2016/10/17.

//  Copyright © 2016年 Vie. All rights reserved.

//

#import <UIKit/UIKit.h>

typedef NS_ENUM(NSUInteger, VLoadMoreType) {

VLoadMoreTypeDefault = 0,//默认上拉加载样式

};

@interface VLoadMoreFootView : UIView

typedef void (^beginLoadMoreBlock) (VLoadMoreFootView *vrefresh);//加载更多事件回调

@property(nonatomic,assign) NSUInteger type;//加载更多视图样式

/**

创建上拉加载新视图

@param scrollView         滚动视图

@param beginLoadMoreBlock 开始加载更多回调

@return 加载视图对象

*/

-(instancetype)initWithScrollView:(UIScrollView *)scrollView beginLoadMoreBlock:(beginLoadMoreBlock)beginLoadMoreBlock;

//停止加载

-(void)endLoadMore;

@end

//

//  VLoadMoreFootView.m

//  上拉加载更多控件

//

//  Created by Vie on 2016/10/17.

//  Copyright © 2016年 Vie. All rights reserved.

//

#import "VLoadMoreFootView.h"

#define  vLoadMoreBottomViewHeight  40

#define navBarHeight  64  //竖屏导航栏和控制器高度(竖屏导航栏高度44,竖屏状态栏高度为20、打电话或者某些情况为40)

@interface VLoadMoreFootView()

@property(nonatomic,copy) beginLoadMoreBlock beginLoadMoreBlock;

@property(nonatomic,weak) UIScrollView *scrollView;

/**

*底部提示语

*/

@property(nonatomic,weak) UILabel *bottomTipLable;

/**

*加载提示

*/

@property(nonatomic,weak) UIActivityIndicatorView *indicatorView;

/**

*是否处于加载状态

*/

@property(nonatomic,assign) BOOL isLoad;

@end

@implementation VLoadMoreFootView

#pragma mark - init方法

-(instancetype)initWithScrollView:(UIScrollView *)scrollView beginLoadMoreBlock:(beginLoadMoreBlock)beginLoadMoreBlock{

self=[super initWithFrame:CGRectMake(0, 0, scrollView.frame.size.width, vLoadMoreBottomViewHeight)];

if (self) {

_scrollView=scrollView;

_beginLoadMoreBlock=beginLoadMoreBlock;

//把当前视图加载到scrollView的UI

[_scrollView addSubview:self];

//设置背景颜色

self.backgroundColor=[UIColor clearColor];

//默认不在加载状态

self.isLoad=false;

//注册观察这,监听上拉加载改变

[_scrollView addObserver:self forKeyPath:@"contentOffset" options:NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew context:nil];

}

return self;

}

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context{

if ([keyPath isEqualToString:@"contentOffset"]) {

if (_scrollView.contentOffset.y>(_scrollView.contentSize.height-_scrollView.frame.size.height)&&!self.isLoad&&_scrollView.dragging) {

[self.indicatorView startAnimating];

self.isLoad=true;

self.bottomTipLable.text=@"加载中..";

_scrollView.contentInset = UIEdgeInsetsMake(0, 0, vLoadMoreBottomViewHeight, 0);

if (_beginLoadMoreBlock) {

_beginLoadMoreBlock(self);

}

}

}

}

//停止加载

-(void)endLoadMore{

[UIView animateWithDuration:0.3 animations:^{

//        _scrollView.contentInset = UIEdgeInsetsZero;

_scrollView.contentInset = UIEdgeInsetsMake(navBarHeight, 0, 0, 0);

} completion:^(BOOL finished) {

[self.indicatorView stopAnimating];

self.isLoad=false;

_bottomTipLable.text = @"上拉加载更多数据";

}];

}

/*

// Only override drawRect: if you perform custom drawing.

// An empty implementation adversely affects performance during animation.

*/

- (void)drawRect:(CGRect)rect {

// Drawing code

if (_type) {

}else{

//没有指定type用默认视图

[self setDefaultView];

}

}

//默认样式

-(void)setDefaultView{

[self bottomTipLable];

}

-(UILabel *)bottomTipLable{

if (!_bottomTipLable) {

UILabel *lb = [[UILabel alloc] initWithFrame:CGRectMake(0, _scrollView.contentSize.height, self.frame.size.width,self.frame.size.height)];

lb.textAlignment = NSTextAlignmentCenter;

lb.textColor = [UIColor grayColor];

lb.font = [UIFont systemFontOfSize:13];

lb.text = @"上拉加载更多数据";

[self addSubview:lb];

_bottomTipLable = lb;

}

return _bottomTipLable;

}

#pragma mark - 懒加载创建控件

- (UIActivityIndicatorView *)indicatorView

{

if (!_indicatorView)

{

UIActivityIndicatorView *act = [[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(50, _scrollView.contentSize.height, 30, self.frame.size.height)];

act.color = [UIColor grayColor];

[self addSubview:act];

_indicatorView = act;

}

return _indicatorView;

}

-(void)dealloc{

[_scrollView removeObserver:self forKeyPath:@"contentOffset"];

}

@end

iOS,自定义控件的更多相关文章

  1. iOS 自定义控件开发(中)

    <iOS 自定义控件开发(上)> <iOS 自定义控件开发(中)> 接上篇iOS自定义控件开发之后,我们尝试另外一种. 在Xcode的右边,会看到如下的图 其中,上面有一个:C ...

  2. iOS 自定义控件开发(上)

    工作需要,最近在进行iOS方面的图表工作.找了很多第三方库都无法实现效果,所以决定自己写一个控件. <iOS 自定义控件开发(上)> <iOS 自定义控件开发(中)> #0 目 ...

  3. iOS自定义控件教程:制作一个可重用的旋钮

    当你的APP需要一些新功能时,自定义UI控件会十分有用,尤其是这些自定义控件可以在其他APP里面很好的重用.Colin Eberhart写过一篇很棒的介绍自定义UI控件的教程.这个教程涉及的是一个继承 ...

  4. 分享一下我封装iOS自定义控件的体会,附上三个好用的控件Demo <时间选择器&多行输入框&日期选择器>

    前段时间有小伙伴问到我:"这样的控件该怎么做呢?",我感觉是个比较简单的控件,可能对于入行不久的同志思路没有很清晰吧.趁着最近工作不忙,就来这里分享一下我封装自定义控件的几点体会吧 ...

  5. 关于iOS自定义控件:在view上实现事件和代理

    自定义控件.h #import <UIKit/UIKit.h> #import "PPViewtouchesBeginDelegate.h" @interface PP ...

  6. iOS自定义控件创建原理(持续更新)

    前言 因为如果要创建各种自定义控件根据需求的不同会有很多的差别,所以我就在这里,分析一些自定义控件的创建实现方法 弹出视图 1.把要弹出的视图装在一个控制器里面,自定义转场动画 2.创建一个弹出视图, ...

  7. iOS自定义控件开发详解

    http://blog.csdn.net/zhangao0086/article/details/45622875

  8. IOS知识小记

    iOS开发 小知识点 http://www.cnblogs.com/tangbinblog/archive/2012/07/20/2601324.html Objective-C中的instancet ...

  9. Android开发之自定义组件和接口回调

    说到自定义控件不得不提的就是接口回调,在Android开发中接口回调用的还是蛮多的.在这篇博客开始的时候呢,我想聊一下iOS的自定义控件.在iOS中自定义控件的思路是继承自UIView, 在UIVie ...

随机推荐

  1. 11g新特性-查询缓存(1)

    众所周知,访问内存比访问硬盘快得多,除非硬盘体系发生革命性的改变.可以说缓存在Oracle里面无处不在,结果集缓存(Result Cache)是Oracle Database 11g新引入的功能,引入 ...

  2. 【Cocos2d-x for WP8 学习整理】(2)Cocos2d-Html5 游戏 《Fruit Attack》 WP8移植版 开源

    这一阵花了些时间,把 cocos2d-html5 里的sample 游戏<Fruit Attack>给移植到了WP8上来,目前已经实现了基本的功能,但是还有几个已知的bug,比如WP8只支 ...

  3. 关于jqgrid数据不显示问题

    近日有个需求要用到jqgrid,原本用着一切都很顺利,但是在需求变动后,只是修改部分字段名称jqgrid就不显示数据了,后台数据也能传到前台,但是就是不给我显示,到嘴的肉就是没法吃,蛋疼,郁闷都无法形 ...

  4. 疯狂房价"逼死"年轻人,别指望中国未来能出人才了

    社会高房价,杀死那个学者 --北京青年学者生存侧记 这一轮,房价又上涨了,只有更疯狂. 几年前,北京三环内的房价突破5万,世人惊呼:没几年,四环5万了,五环5万了:这一轮,北京城乡结合部,哪怕脏乱差之 ...

  5. 一些SQL

    复制当前所有,ID自动增长.       insert into test(name,pass) select name,pass from test 删除当前重复      delete A fro ...

  6. SOAPUI使用教程-验证SOAP服务

    当soapUI创建一个功能性TestCase 一个很常见的场景是你想一些SOAP / WSDL服务验证响应检查返回正确的结果. 一旦你导入了您想要测试的WSDL服务这样做很容易: 添加一个新的SOAP ...

  7. Unity3d uGUI适配

    Cavas: 1.Render Model设置为:Screen Space- Camera.如果想在UI前面加特效我可以在创建一个摄像机(UIForward)深度大于这个UICamera就行了. 2. ...

  8. css 选择器优先级

    优先级自上而下逐渐递减 1. 在属性后面使用 !important 会覆盖页面内任何位置定义的元素样式. 2.作为style属性写在元素内的样式 3.id选择器 4.类选择器 5.标签选择器 6.通配 ...

  9. html容易犯的错误

    原文地址:http://www.jb51.net/web/20593.html 在晚上看见一个不错的文章,可惜里面的错误都是我经常犯的…… 我们最好开始注意了,因为HTML Police会走遍你的代码 ...

  10. js 爱恨情仇说 this

    this 相信大家在写代码的时候都会遇到,可是怎么样才能用好this,估计这个还是有点困难的,虽然你有时候你会用到,但是他所在的具体的几个场景中所代表的是什么意思了?可能这个你就不是很清楚啊.这个就会 ...