随手整理2

16.UIScrollView的用法以及它的一些常用属性
   self.scrollView.contentSize = CGSizeMake(892, 480);//设置scrollView内容的尺寸
   self.scrollView.contentInset = UIEdgeInsetsMake(10, 20, 40, 80);//设置scrollView的内边距上,左,下,右,分别为,10,20,40,80
   self.scrollView.contentOffset = CGPointMake(0, -64);//设置一开始的滚动位置(往下滚动64)




17.如果UIScrollView无法滚动,可能是以下原因:
   1.没有设置contentSize
   2.scrollEnabled = NO
   3.没有接收到触摸事件:userInteractionEnabled = NO
   4.没有取消autolayout功能(要想scrollView滚动,必须取消autolayout)


18.UIScrollView的代理(delegate)


   1.当UIScrollView发生一系列的滚动操作时, 会自动通知它的代理(delegate)对象,给它的代理发送相应的消息,让代理得知它的滚动情况.
   2.一般是让控制器成为scrollView的代理,让控制器遵守id<UIScrollViewDelegate> delegate协议,然后实现协议中的方法.代理方法有以下常用的几个:
      - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView; // 用户开始拖拽时调用
      - (void)scrollViewDidScroll:(UIScrollView *)scrollView;// 滚动到某个位置时调用
      - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate;// 用户结束拖拽时调用


19.利用UIScrollView实现图片的缩放功能
   当用户在UIScrollView身上使用捏合手势时,UIScrollView会调用代理的viewForZoomingInScrollView:方法,这个方法返回的控件就是需要进行缩放的控件
   缩放实现步骤:
   1.设置UIScrollView的id<UISCrollViewDelegate> delegate代理对象
   2. self.scrollView.maximumZoomScale = 2.0;//缩小的最小比例
   3. self.scrollView.minimumZoomScale = 0.2;//放大的最大比例
   4.让代理对象实现下面的方法,返回需要缩放的视图控件
   5.- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
{ return 要缩放的那个控件 }


20.ScrollView分页
   1.for (int i = 0; i<MJImageCount; i++) {//添加5张图片到scrollView中
        UIImageView *imageView = [[UIImageView alloc] init];
        CGFloat imageX = i * imageW;//每一张图片的X值
        imageView.frame = CGRectMake(imageX, imageY, imageW, imageH);//设置每一个图片的frame,imageY为0;
        NSString *name = [NSString stringWithFormat:@"img_0%d", i + 1];
        imageView.image = [UIImage imageNamed:name];
        [self.scrollView addSubview:imageView];//把图片放到scrollView当中.
    }


    CGFloat contentW = MJImageCount * imageW;
    self.scrollView.contentSize = CGSizeMake(contentW, 0);//设置内容尺寸
    self.scrollView.showsHorizontalScrollIndicator = NO;//隐藏水平滚动条
    self.scrollView.pagingEnabled = YES;//设置其具有分页效果,UIScrollView会被分割成多个独立页面,里面的内容就能进行分页展示
    2.在适当的位置拖入一个pageControl,
     self.pageControl.numberOfPages = MJImageCount;//设置总页数为图片的个数
    3.计算当前页
     - (void)scrollViewDidScroll:(UIScrollView *)//设置代理后,当scrollView正在滚动就会调用此方法,
    {
       CGFloat scrollW = scrollView.frame.size.width;
       int page = (scrollView.contentOffset.x + scrollW * 0.5) / scrollW;//计算当前页(当前开始滚动位置的X值 + 半个scrollView / srcollView的宽度).  
       self.pageControl.currentPage = page;//设置当前是第几页
    }
    
    4.实现下一页效果
    - (void)nextImage
    {
        int page = 0;//1.增加pageControl的页码
        if (self.pageControl.currentPage == MJImageCount - 1) {//如果是最后一页的话, 让页码变为第0页
             page = 0;
        } else {
             page = self.pageControl.currentPage + 1;//不是第一页,让当前页加1,
        }//引入中间变量是为了不让计算当前页重复计算,出前页码前后跳动效果
        CGFloat offsetX = page * self.scrollView.frame.size.width;//计算当前开始滚动位置的X值为(计算好的页码*当前srcollView的可视宽度);
        CGPoint offset = CGPointMake(offsetX, 0);
        [self.scrollView setContentOffset:offset animated:YES];//重新设置ContentOffset值,实现跳到下一页效果.
    }
    
21.NSTimer定时器
    定义一个定时器属性.
    self.timer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(nextImage) userInfo:nil repeats:YES];每隔2秒重复调用一次self 的nextImage方法
    通过invalidate方法可以停止定时器的工作,一旦定时器被停止了,就不能再次执行任务。只能再创建一个新的定时器才能执行新的任务
    [[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];//拿到当前的主线程消息,给分流一些时间让其去执行,定时器.这样就不会出现当其它的一些操作正在进行时, 定时器停止工作.


22.tableView的基本用法


    一般是控制器遵守UITableViewDataSource协议, 实现以下基本方法
    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView;// 一共有多少组数据
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section; // 每一组有多少行数据
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;// 每一行显示什么内容
    UITableView的每一行都是一个UITableViewCell,通过dataSource的tableView:cellForRowAtIndexPath:方法来初始化每一行
    indexPath可以唯一的确定一个cell (indexPath.section//当前所在的列,indexPaht.row//当前所在的行);
    
    - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section//第section组显示的头部标题,属于数据源方法
    {
       return @"头部标题";
    }


   - (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView//返回右边索引条显示的字符串数据,属于数据源方法
    {
    return [self.groups valueForKeyPath:@"title"];
    }
    
   有时候需要知道tableview发生的一些事情, 就要先设置它的代理,一般设控制器为其代理:遵守<UITableViewDelegate>协议
   self.tableView.rowHeight = 60//设置行高(每一行的高度一致)


   - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath//每一行的高度不一致的时候使用这个方法来设置行高  属于代理方法
   {
       if (indexPath.row == 0) return 100;
       return 60;
   }


  - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath//当点击tableView的某一行时, 就会自动调用这个方法
  {
    // 1.取得被点击这行对应的模型
    MJHero *hero = self.heros[indexPath.row];
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"数据展示" message:nil delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"确定", nil];// 创建一个弹框窗口,
    alert.alertViewStyle = UIAlertViewStylePlainTextInput;//设置窗口类型为文本输入
    [alert textFieldAtIndex:0].text = hero.name;// 取得唯一的那个文本框,显示英雄的名称
    [alert show];//让窗口显示
    alert.tag = indexPath.row; // 绑定行号到alertView上目的是能够把是当前所在的行传到 UIAlertView代理方法中,供其使用.
  }
 先修改模型再刷新表格
  - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex// UIAlertView的代理方法,点击了alertView上面的按钮就会调用这个方法
 {
    if (buttonIndex == 0) return;
    NSString *name = [alertView textFieldAtIndex:0].text;//取得文本框最后的文字
    // 2.修改模型数据
    int row = alertView.tag;
    MJHero *hero = self.heros[row];
    hero.name = name;
    3.告诉tableView重新加载模型数据
    reloadData : tableView会向数据源重新请求数据
    重新调用数据源的相应方法取得数据
    重新调用数据源的tableView:numberOfRowsInSection:获得行数
    重新调用数据源的tableView:cellForRowAtIndexPath:得知每一行显示怎样的cell
    全部刷新
    [self.tableView reloadData];
    局部刷新
    NSIndexPath *path = [NSIndexPath indexPathForRow:row inSection:0];//要刷新哪一行的
    [self.tableView reloadRowsAtIndexPaths:@[path] withRowAnimation:UITableViewRowAnimationBottom];//刷新指定的行的数据
  }


23.tableView的常用属性
   self.tableView.separatorColor = [UIColor colorWithRed:255/255.0 green:255/255.0 blue:0 alpha:255/255.0];//设置每行分隔线的颜色
   self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;//设置分隔线的样式
   self.tableView.tableHeaderView = [UIButton buttonWithType:UIButtonTypeContactAdd];//表格头部的控件


24.Cell的重用原理:
     当滚动列表时,部分UITableViewCell会移出窗口,UITableView会将窗口外的UITableViewCell放入一个对象池中,等待重用。当UITableView要求dataSource返回UITableViewCell时,dataSource会先查看这个对象池,如果池中      有未使用的UITableViewCell,dataSource会用新的数据配置这个UITableViewCell,然后返回给UITableView,重新显示到窗口中,从而避免创建新对象
  代码体现:
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
      static NSString *ID = @"mjcell"; // 1.定义一个cell的标识
      UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID]; // 2.从缓存池中取出cell
      if (cell == nil) {// 3.如果缓存池中没有cell
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ID];
      }
    // 4.设置cell的属性以及数据...
      return cell;
    }


25.UITableViewCell结构
   UITableViewCell内部有个默认的子视图:contentView,contentView是UITableViewCell所显示内容的父视图,可显示一些辅助指示视图,辅助指示视图的作用是显示一个表示动作的图标,可以通过设置UITableViewCell的            accessoryType来显示,默认是UITableViewCellAccessoryNone,还可以通过cell的accessoryView属性来自定义辅助指示视图.
   contentView下默认有3个子视图,其中2个是UILabel(通过UITableViewCell的textLabel和detailTextLabel属性访问)
   第3个是UIImageView(通过UITableViewCell的imageView属性访问)
   UITableViewCell还有一个UITableViewCellStyle属性,用于决定使用contentView的哪些子视图,以及这些子视图在contentView中的位置


26.使用xib封装一个view的步骤
   1.新建一个xib文件描述一个view的内部结构(假设叫做MJTgCell.xib)
   2.新建一个自定义的类(自定义类需要继承自系统自带的view, 继承自哪个类,  取决于xib根对象的Class)
   3.新建类的类名最好跟xib的文件名保持一致(比如类名就叫做MJTgCell)
   4.将xib中的控件 和 自定义类的.m文件 进行连线
   5.提供一个类方法返回一个创建好的自定义view(屏蔽从xib加载的过程)
   6.提供一个模型属性让外界传递模型数据
   7.重写模型属性的setter方法,在这里将模型数据展示到对应的子控件上面


27.代理的使用场合
   1.对象A内部发生了一些事情,想通知对象B
   2.对象B想监听对象A内部发生了什么事情
   3.对象A想在自己的方法内部调用对象B的某个方法,并且对象A不能对对象B有耦合依赖
   4.对象A想传递数据给对象B
   以上情况,结果都一样:对象B是对象A的代理(delegate)


28.使用delegate的步骤:
   1.先搞清楚谁是谁的代理(delegate)
   2.定义代理协议,协议名称的命名规范:控件类名 + Delegate
   3.定义代理方法
     代理方法一般都定义为@optional
     代理方法名都以控件名开头
     代理方法至少有1个参数,将控件本身传递出去
   4.设置代理(delegate)对象  (比如myView.delegate = xxxx;)
   5.代理对象遵守协议
   6.代理对象实现协议里面该实现的方法
   7.在恰当的时刻调用代理对象(delegate)的代理方法,通知代理发生了什么事情(在调用之前判断代理是否实现了该代理方法)


29.通过代码自定义cell步骤:
   1.新建一个继承自UITableViewCell的类
   2.重写initWithStyle:reuseIdentifier:方法
     添加所有需要显示的子控件(不需要设置子控件的数据和frame,  子控件要添加到contentView中)
     进行子控件一次性的属性设置(有些属性只需要设置一次, 比如字体\固定的图片)
   3.提供2个模型
     数据模型: 存放文字数据\图片数据
     frame模型: 存放数据模型\所有子控件的frame\cell的高度
   4.cell拥有一个frame模型(不要直接拥有数据模型)
   5.重写frame模型属性的setter方法: 在这个方法中设置子控件的显示数据和frame
   6.frame模型数据的初始化已经采取懒加载的方式(每一个cell对应的frame模型数据只加载一次)


  
  













  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值