zoukankan      html  css  js  c++  java
  • Objective-c——UI基础开发第七天(自定义UITableView)

    一、梗概:

      1、自定义:headerView,footerVie,Cell等

      2、双模型(遵循单一原则,类或模型实现的功能尽量单一)

      3、计算文本的方法(针对不同文本内容而设置的宽高等)

      4、设置footerView和headerView的注意事项(能修改的值可以是xmargin和高度,有些是不能修改的方法 ,采取方式:设置一个tempView,实际的操作都在tempView中进行)

      5、UIActivityIndicatorView(转动菊花)startAnimating/stopAnimating

      6、注意alpha=0和clean color 的区别(alpha=0设置,其子控件也会相应的看不见,但是cleancolor的话,只能让其颜色变为透明,子控件依旧可见)

      7、延迟的方法(performSelector/dispatch_after(GCD :grand central dispatch))

    二、自定义headerView(ScrollView和pageControl)

    创建一个bannerview 继承自UIView

    @property (nonatomic ,strong) NSArray* imageArray;//数据定义在viewcontroller中,功能要分开

    a、设置scrollview

    b、设置pageControl

    1、设置ScrollView属性(滚动的范围和图片的大小和数量有关,暂时不设置contentSize)

    scrollview.showsHorizontalScrollIndicator =NO;

    scrollview.pagingEnabled=YES;

    将scrollview实例化

    self.scrollview=scrollview;

    2、设置pagecontrol属性(总的page数和数组的图片数量有关,暂不设置 numberOfPages)

    pagecontrol.currentPage =0;

    pagecontrol.pageIndicatorTintColor =[UIColor grayColor];

    pagecontrol.currentPageIndicatorTintColor=[UIColor redColor];

    将pagecontrol实例化

    self.pagecontrol=pagecontrol;

    3、设置pagecontrol的总页数和scrollView的滚动范围

    scrollview.contentSize =CGSizeMake(count*self.bounds.size.width,0);

    pagecontrol.numberOfPages=ImageArray.count;

    4、设置根据scrollview的滚动让pagecontrol的currentpage跟随着变化(contentOffset scrollviewDidEndDecelerating)

    -(void) scrollviewDidEndDecelerating:(UIScrollView*)scrollview

    {

    _pagecontrol.currentPage = _scrollview.contentOffset.x/(self.bounds.size.width);

    }

    5、如何在viewcontroller的tableview调用该bannerview作为其headerview

    #import "BannerView.h"

    BannerView *bannerview=[[BannerView alloc]initWithFrame:CGrectMake(0,0,[UIScreen mainScreen].bounds.size.width,200)];

    BannerView.imageArray =@[@"",@"",@"",@""];//传入图片数据

    tableview.tableHeaderView =bannerview;

    三、自定义footerView(两个方法,一、直接手动添加footerview 二、xib)

    三(1)手动添加footerView

    UIView *tempView =[UIView alloc]initWithFrame:CGRectMake(0,0,self.view.bounds.size.width,120)];

    UIButton *footerbtn =[[UIButton alloc]initWithFrame:CGRectMake(10,10,self.view.bounds.size.width-20,65)];

    [footerbtn setTitle :@"点击加载更多" fotState :UIControlStateNormal];

    //如果要实现footerbtn的方法,用addTarger

    footerbtn.BackgroundColor=[UIColor orangeColor];

    [tempView addSubview:footerbtn];

    tableview.tableFooterView =tempView;

    三(2)通过xib设置footerview

    1、创建名为FooterView的Xib文件 并关联属性

    2、在viewcontroller中的tableview中加载footerview(NSBundle mainBundle loadNibNamed)

    #import "FooterView.h"

    FooterView *footerView =[[[NSBundle mainBundle]loadNibNamed:@"FooterView" owner:nil options:nil]lastObect];

    tableview.tableFooterView =footerview(此时,不需要定义临时视图就可以直接添加了)

    3、实现footerview中的加载按钮,实现(按钮文字变换,菊花转动,插入新的数据)

    1)在xib中加入一个view其中包含UIActivityIndicatorView和label:正在加载中

    并把这个view 的alpha设置为0

    注意,当把view的背景色设置为cleanColor

    虽然view不见了,可是label“正在加载中”和菊花仍在

    而alpha=0则view及view里面所有子控件都看不见

    1)定义btnclick 的方法

    -(IBAction)loadButton:(id)sender{

    }

    -(void)showLoadViewWith:(BOOL)isShow

    {

    _moreView.alpha=0;

    if(isShow)

    {[_activiteView startAnimating];}

    else{[_activiteView stopAnimating];}}

    2)当footerview中的按钮被点击的时候,viewController中应该为其传入数据(此处可以联想到使用代理)

    2.1)怎么实现代理??

    a、@class FooterView;

    b、@protocol FooterViewDelegate<NSObject>

    c、定义代理方法

    -(void )footerview:(FooterView *)footerView;

    d、创建代理属性(weak注意用weak,用strong的话,双方都是强引用,造成循环引用而不被释放)

    @property (nonatomic,weak)if<FooterViewDelegate>delegate;

    e、在执行方法的button事件中,触发代理方法通知获取数据(self.delegate respondsToSelector:@selector(footerView:)])

    -(IBAction)loadButton:(id)sender{

    if([self.delegate respondsToSelector:@selector(footerView:)]){

    [self.delegate footerView:self];}}

    f、在viewcontroller中实现代理方法

      <FooterViewDelegate>

    -(void)footerView:(FooterView*)footerView

    {

    [footerView showLoadViewWith:YES];

    //添加数据的时候,实现延迟效果有两个方法

    方法一、[self(performSelector:@selector(loadMoreData:)Withbject:nil afterDelay:2)];

    方法二、dispatch_after(dispath_time(DISPATCH_TIME_NOW,(int64_t)(2*

    NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

     [footerView showLoadViewWith:NO];

    //添加的数据

           GroupModel *model =[[GroupModel alloc]init];

             model.title=@"江边一枝花";

             model.icon=@"2c97690e72365e38e3e2a95b934b8dd2";

               [self.dataArray addObject:model];

     //刷新数据

    #warning 当我选择单个刷新的时候,会报错,只能选择全部刷新   

            NSIndexPath *indexPath =[NSIndexPath indexPathForRow:self.dataArray.count -1 inSection:0];

            /* [_tableview reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationLeft];

             */

            [_tableview reloadData];

            //滚动到最后一行

            [_tableview scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionBottom animated:true];

        });

  • 相关阅读:
    jmeter压测学习42-逻辑控制器之交替控制器
    jmeter压测学习41-逻辑控制器之吞吐量控制器
    jmeter压测学习40-逻辑控制器之事务控制器
    jmeter压测学习39-获取post请求x-www-form-urlencoded格式的数据
    jmeter压测学习38-通过Jython调用Python脚本
    对微信小程序的生命周期进行扩展 – Typescript 篇
    在微信小程序开发中使用Typescript
    TCP长连接和短连接 Python代码
    jQuery Ajax编程
    Django 网页中文显示u开头的乱码
  • 原文地址:https://www.cnblogs.com/CityPe/p/5360879.html
Copyright © 2011-2022 走看看