zoukankan      html  css  js  c++  java
  • ios 上拉载入下拉刷新Dome

    为练手写了一个小的上拉载入很多其它下拉刷新的小的Dome 。

    没有太多的技术含量,仅仅是作为新手的启示用。是上一篇下拉载入的扩展。先看一下那个再看这个就easy非常多。


    Dome下载:http://download.csdn.net/detail/u010123208/8062715


    先来梳理一下:

    上拉家在很多其它就是上拉之后在底部现实一个视图,用来提示用户上拉载入很多其它,假设用户上拉就出发事件。进行载入并在试图中给予提示,同一时候后台载入数据,将加入的数据加入数据数组,最后又一次导入列表;

    下拉刷新相同的操作,仅仅只是就是将数组清空又一次来导入数据;

    首先我们要创建两个view 一个是顶部显示,一个在底部显示 ;

    在view中要显示如今文字,一张图片,一个活动指示框(当进行网络请求载入数据的时候显示。其它时候隐藏),假设不太理解下载Dome看一下就知道了。

    typedef enum {
        InsertStateNomal,    //寻常状态
        InsertStateDrapUp,   //上拉状态
        InsertStateDrapDown, //下拉状态
        InsertStateRun,      //正在载入的状态
    }InsertState;
    
    @interface HeadView : UIView
    
    @property (nonatomic,strong) UIImageView *imageView; 
    @property (nonatomic,strong) UILabel *label;
    @property (nonatomic,assign) InsertState insertState;
    @property (nonatomic,strong) UIActivityIndicatorView *activity;
    
    - (void)setInsertNomal;  
    - (void)setInsertDrapDown;
    - (void)setInsertRun;
    @end
    
    
    @interface FootView : UIView
    
    @property (nonatomic,strong) UIImageView *imageView;
    @property (nonatomic,strong) UILabel *label;
    @property (nonatomic,assign) InsertState insertState;
    @property (nonatomic,strong) UIActivityIndicatorView *activity;
    
    - (void)setInsertNomal;
    - (void)setInsertDrapDoUp;
    - (void)setInsertRun;
    
    @end

    枚举用来指示视图的当前状态;


    事实上两个视图的内容什么的都全然一样;

    //
    //  InsertView.m
    //  RefreshDome
    //
    //  Created by 小屁孩 on 14-10-16.
    //  Copyright (c) 2014年 XS. All rights reserved.
    //
    
    #import "InsertView.h"
    
    @implementation HeadView
    
    @synthesize imageView;
    @synthesize label;
    @synthesize insertState;
    @synthesize activity;
    
    - (id)initWithFrame:(CGRect)frame
    {
        self = [super initWithFrame:frame];
        if (self) {
            
            self.backgroundColor = [UIColor orangeColor];
            //图片
            imageView = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"arrow.png"]];
            imageView.frame = CGRectMake(20, frame.size.height-60, 30, 50);
            [self addSubview:imageView];
            
            //显示的文字
            label = [[UILabel alloc]initWithFrame:CGRectMake(60, frame.size.height-60, 250, 50)];
            label.text = @"下拉刷新...";
            label.textAlignment = NSTextAlignmentCenter;
            [self addSubview:label];
            
            //状态
            insertState = InsertStateNomal;
            
            //活动指示器
            activity = [[UIActivityIndicatorView alloc]initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
            activity.frame = CGRectMake(20,frame.size.height-60, 30, 50);
            [self addSubview:activity];
        }
        return self;
    }
    
    //初始状态
    -(void)setInsertNomal
    {
        insertState = InsertStateNomal;
        label.text = @"下拉刷新.....";
        imageView.layer.transform = CATransform3DMakeRotation(M_PI*2, 0, 0, 1);
        [activity stopAnimating];
        imageView.hidden =NO;
    }
    
    //下拉状态
    - (void)setInsertDrapDown
    {
        insertState = InsertStateDrapDown;
        [UIView beginAnimations:nil context:nil];
        label.text = @"释放后刷新.....";
        imageView.layer.transform = CATransform3DMakeRotation(M_PI, 0, 0, 1);
        [UIView commitAnimations];
        
    }
    
    //刷新状态
    - (void)setInsertRun
    {
        insertState =InsertStateRun;
        label.text = @"正在刷新.....";
        imageView.hidden = YES;
        [activity startAnimating];
    }
    @end
    
    
    @implementation FootView
    
    @synthesize imageView;
    @synthesize label;
    @synthesize insertState;
    @synthesize activity;
    
    - (id)initWithFrame:(CGRect)frame
    {
        self = [super initWithFrame:frame];
        if (self) {
            
            self.backgroundColor = [UIColor orangeColor];
            //图片
            imageView = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"arrow.png"]];
            imageView.layer.transform = CATransform3DMakeRotation(M_PI , 0, 0, 1);
            imageView.frame = CGRectMake(20, 10, 30, 50);
            [self addSubview:imageView];
            
            //文字
            label = [[UILabel alloc]initWithFrame:CGRectMake(60, 10, 250, 50)];
            label.text = @"上拉载入很多其它.....";
            label.textAlignment = NSTextAlignmentCenter;
            [self addSubview:label];
            
            //状态
            insertState = InsertStateNomal;
            
            //活动指示器
            activity = [[UIActivityIndicatorView alloc]initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
            activity.frame = CGRectMake(20, 10, 30, 50);
            [self addSubview:activity];
        }
        return self;
    }
    
    //初始状态
    - (void)setInsertNomal
    {
        insertState = InsertStateNomal;
        label.text = @"上拉载入很多其它.....";
        imageView.layer.transform = CATransform3DMakeRotation(M_PI , 0, 0, 1);
        [activity stopAnimating];
        imageView.hidden =NO;
    }
    
    //上拉状态
    - (void)setInsertDrapDoUp
    {
        insertState = InsertStateDrapUp;
        [UIView beginAnimations:nil context:nil];
        label.text = @"释放后载入很多其它.....";
        imageView.layer.transform = CATransform3DMakeRotation(M_PI * 2, 0, 0, 1);
        [UIView commitAnimations];
    }
    
    //载入状态
    - (void)setInsertRun
    {
        insertState = InsertStateRun;
        label.text = @"正在载入.....";
        imageView.hidden = YES;
        [activity startAnimating];
    }
    @end


    最后就是列表了;


    事实上在这里面须要注意的:

    • 要如何为表格加入视图
    • 加入的底部视图随着内容的增多,是不断变化的(这里我用了KVO来控制,当数组元素变化后处理位置)
    • 当完毕下拉或者上拉的时候。短暂的视图显示怎么来控制
    • 上拉下拉的推断(UIScrollview代理)条件;

    #import <UIKit/UIKit.h>
    #import "InsertView.h"
    
    @interface ViewController : UIViewController<UITableViewDataSource,UITableViewDelegate,UIScrollViewDelegate>
    
    @property (weak, nonatomic) IBOutlet UITableView *table;
    @property (nonatomic,strong) NSMutableArray *tableArray;
    
    
    @end

    #import "ViewController.h"
    
    @interface ViewController ()
    
    @end
    
    @implementation ViewController
    {
        HeadView *headView;
        FootView *footView;
    }
    
    @synthesize tableArray;
    @synthesize table;
    
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
        table.frame = CGRectMake(0, 20, 320, [[UIScreen mainScreen]bounds].size.height-20);
        table.delegate = self;
        table.dataSource = self;
        table.tableFooterView = [[UIView alloc]init];
        
        //下拉头部视图
        headView = [[HeadView alloc]initWithFrame:CGRectMake(0, -251, DEVICE_FRAME.size.width, 251)];
        [table addSubview:headView];
        
        //上拉底部视图
        footView = [[FootView alloc]initWithFrame:CGRectMake(0, table.frame.size.height, DEVICE_FRAME.size.width, 251)];
        [table addSubview:footView];
        
        //初始化数组
        tableArray = [NSMutableArray array];
        for (int i = 0; i<15; i++) {
            NSURL *url=[NSURL URLWithString:@"http://www.sinaimg.cn/qc/photo_auto/chezhan/2012/50/00/15/80046_950.jpg"];
            UIImage *image = [UIImage imageWithData:[NSData dataWithContentsOfURL:url]];
            [tableArray addObject:image];
        }
        
        float hight =tableArray.count * 60 ;
        if (tableArray.count * 60  < [[UIScreen mainScreen]bounds].size.height ) {
            hight = table.frame.size.height;
        }
        footView.frame = CGRectMake(0, hight, 320, 251);
        
        [self addObserver:self forKeyPath:@"tableArray" options:NSKeyValueObservingOptionNew context:nil];
        
    }
    
    - (void) addtableMutableArray
    {
        for (int i = 0; i<5; i++) {
            NSURL *url=[NSURL URLWithString:@"http://www.sinaimg.cn/qc/photo_auto/chezhan/2012/50/00/15/80046_950.jpg"];
            UIImage *image = [UIImage imageWithData:[NSData dataWithContentsOfURL:url]];
            [self.tableArray addObject:image];
        }
        self.tableArray = tableArray;
        [footView setInsertNomal];
        [self performSelectorOnMainThread:@selector(endThread) withObject:nil waitUntilDone:NO];
    }
    
    - (void)endThread
    {
        
        [UIView beginAnimations:nil context:nil];
        table.contentInset = UIEdgeInsetsMake(0, 0, 0, 0);
        [UIView commitAnimations];
        [table reloadData];
        NSLog(@"%d",tableArray.count);
    }
    
    
    - (void) refesh
    {
        NSMutableArray *array = [NSMutableArray array];
        for (int i = 0; i<15; i++) {
            NSURL *url=[NSURL URLWithString:@"http://wenwen.sogou.com/p/20110923/20110923201826-1347223277.jpg"];
            UIImage *image = [UIImage imageWithData:[NSData dataWithContentsOfURL:url]];
            [array addObject:image];
        }
        self.tableArray = array;
        [headView setInsertNomal];
        [self performSelectorOnMainThread:@selector(endThread) withObject:nil waitUntilDone:NO];
    }
    
    
    #pragma mark KVO
    -(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
    {
        NSMutableArray *array = [change objectForKey:@"new"];
        float hight =array.count * 60;
        if (array.count * 60  < [[UIScreen mainScreen]bounds].size.height ) {
            hight = [[UIScreen mainScreen]bounds].size.height;
        }
        footView.frame = CGRectMake(0, hight, 320, 251);
        
    }
    
    #pragma mark tabledelegate
    
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    {
        return  tableArray.count;
    }
    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        return 60;
    }
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        static NSString *identityCell = @"Cell";
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identityCell];
        if (cell == nil) {
            cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identityCell];
        }
        cell.imageView.image = [tableArray objectAtIndex:indexPath.row];
        cell.textLabel.text = @"NibBi";
        return cell;
    }
    
    
    #pragma mark - scrolldelegae
    
    - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
    {
        if (headView.insertState == InsertStateDrapDown) {
            [UIView beginAnimations:nil context:nil];
            table.contentInset = UIEdgeInsetsMake(70, 0, 0, 0);
            [headView setInsertRun];
            [UIView commitAnimations];
            [self performSelectorInBackground:@selector(refesh) withObject:nil];
    
        }
        if (footView.insertState == InsertStateDrapUp) {
            [UIView beginAnimations:nil context:nil];
            table.contentInset = UIEdgeInsetsMake(0, 0, 70, 0);
            [footView setInsertRun];
            [UIView commitAnimations];
            [self performSelectorInBackground:@selector(addtableMutableArray) withObject:nil];
        }
    }
    
    -(void)scrollViewDidScroll:(UIScrollView *)scrollView
    {
      // NSLog(@"%f",scrollView.contentOffset.y);
        //上拉载入很多其它转换
        if (scrollView.contentOffset.y > scrollView.contentSize.height - scrollView.frame.size.height + 60 && footView.insertState == InsertStateNomal) {
            [UIView beginAnimations:nil context:nil];
            [footView setInsertDrapDoUp];
            [UIView commitAnimations];
            
        }
        //下拉刷新转换
        if (scrollView.contentOffset.y < -60 && headView.insertState == InsertStateNomal)
        {
            [UIView beginAnimations:nil context:nil];
            [headView setInsertDrapDown];
            [UIView commitAnimations];
        }
    }
    
    
    
    @end



  • 相关阅读:
    HCIA_R&S-学习_Day05(PPPoE、DHCP、ACL、NAT)
    HCIA_R&S-学习_Day04(链路状态协议OSPF & PPP)
    HCIA_R&S-学习_Day03(路由协议基础与实现)
    【详谈 Delta Lake 】系列技术专题 之 湖仓一体( Lakehouse )
    工作7年,我的10条经验总结
    Hologres揭秘:优化COPY,批量导入性能提升5倍+
    谈谈JVM内部锁升级过程
    如何帮用户管好云账本?阿里云数据库助力收钱吧 | 甲子光年
    重磅 | 数据库自治服务DAS论文入选全球顶会SIGMOD,领航“数据库自动驾驶”新时代
    同程旅行基于 RocketMQ 高可用架构实践
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/5099195.html
Copyright © 2011-2022 走看看