zoukankan      html  css  js  c++  java
  • IOS学习笔记 -- scrollView和tableView整理

    scrollView:
    1. 介绍scrollView一些属性
      1>.要想使用scrollView必须做两件事
        1).设置scrollView内容
        2).设置contentSize (滚动范围)
      2>.其他属性
        1). contentOffset(滚动位置)
        2). contentInset(额外增加的滚动区域)
        3). bounces (设置UIScrollView是否需要弹簧效果)
        4). crollEnabled (设置UIScrollView是否能滚动)
        5). showsHorizontalScrollIndicator (是否显示水平滚动条)
        6). showsVerticalScrollIndicator (是否显示垂直滚动条)

    2. 代理
      1>代理思想两个思想
        1).监听思想:B监听A发生了什么事情
        2).通知思想:A发生了一些事情,要通知B去做
      2>scrollView的代理使用
        1).如何成为代理(三步)
          *声明协议
          *设置代理对象self.scrollView.delegate = self;
          *实现协议方法

    2).代理监听scrollView的拖拽事件

    // 开始拖拽
    - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView;
    // 结束拖拽
    - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate;
    // scrollView滚动时执行
    - (void)scrollViewDidScroll:(UIScrollView *)scrollView

    3).用代理实现缩放

    *成为UIScrollView的代理()
    *设置缩放对象(通过viewForZoomingInScrollView方法)
    *设置缩放为范围(maximumZoomScale、minimumZoomScale)

    3. 定时器创建两种方式

    1>. self.timer = [NSTimer scheduledTimerWithTimeInterval:1.f target:self selector:@selector(方法) userInfo:nil repeats:YES];
      当另一个scrollView运行时,会停止定时器的scrollView,只能执行一个scrollView.
    2>. self.timer = [NSTimer timerWithTimeInterval:1.f target:self selector:@selector(方法) userInfo:nil repeats:YES];
      [[NSRunLoop mainRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];
    4. 自定义协议并使用
    1>.定义协议(三步)
      *定义protocol(两种optional[代理对象可不实现]、required[代理对象必须实现])
      *增加代理属性(weak) @property (weak, nonatomic) id<LFAppInfoViewDelegate> delegate;
      *给代理发消息,调用代理的方法(需要判断代理对象是否实现了该方法,不判断调用后(编译时不会)会报错)
      注意:定义协议的名称命名[类名+Delegate]、协议方法的命名规范[方法名称需要去掉前缀,并且将自己作为参数]

      2>.使用代理(三步)
        *声明协议
        *设置代理对象
        *实现协议方法(本例是在代理对象[控制器] 添加一个UILabel)

    tableView:
    1. UITableView 需要设置数据源才能显示数据
      1>.会向数据源查询一共多少组,每组多少行,每行显示什么数据
      2>.数据源必须遵守UITableViewDateSource协议
      3>

      一共有多少组
      - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{}
      第section组有多少行
      - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{}
      每一行显示什么内容
      - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{}
      第section组头部显示什么标题
      - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{}
      第section组底部显示什么标题
      - (NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section{}
      当每一行的cell的高度不一致的时候就使用代理方法设置cell的高度
      - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{}
      当每一行的cell高度一致的时候使用属性设置cell的高度
      self.tableView.rowHeight = 60;
      可以优化内存的可变数组定义
      NSMutableArray *models = [NSMutableArray arrayWithCapacity : (NSUInteger)]

    2. cell常见属性
      1>.cell.textLabel.text 标题
      2>.cell.detailTextLabel.text 介绍
      3>.cell.imageView.image 图片
      4>.cell.accessoryView 辅助视图
      5>.cell.accessoryView 自定义辅助视图
      6>.cell.backgroundView 设置cell的背景颜色
        1).通过backgroundColor 和 backgroundView都可以设置cell的背景
        2).但是backgroundView 的优先级比 backgroundColor的高
        3).所以如果同时设置了backgroundColor和backgroundView, backgroundView会盖住backgroundColor
      7>.cell.selectedBackgroundView 设置选中状态的背景

    3. UITableView常见属性
      1>. tableview.separatorStyle 设置分割线样式
      2>. tableview.separatorColor 设置分割线颜色
        自定义颜色
        [UIColor colorWithRed:色值/255.f green:色值/255.f blue:色值/255.f alpha:色值/255.f];
        获取屏幕宽度: [UIScreen mainScreen].bounds.size.width;
      3>. tableview.tableHeaderView 设置tableView的头部视图 一般用于放广告
      4>. tableview.tableFooterView 设置tableView的底部视图 一般用于放置加载更多按钮
      5>. [self.tableView reloadData]; 刷新表格
        // 刷新指定行
        NSIndexPath *path = [NSIndexPath indexPathForRow:row inSection:0];
        [self.tableView reloadRowsAtIndexPaths:@[path] withRowAnimation:UITableViewRowAnimationRight];

    4. 优化cell的方法
      1>.先去缓存池中查找是否有满足条件的Cell
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
      2>.如果缓存池中没有符合条件的cell,就自己创建一个Cell
        if (nil == cell) {
          cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:identifier];
        }
      3>.创建Cell, 并且设置一个唯一的标记 : identifier 注 : 定义变量 NSString *identifier 推荐用 static定义静态局部变量,不推荐用宏.
      4>.设置cell数据并返回cell

    5. tableView代理方法
      1>. - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{} //当某一行被选中的时候调用
      2>. - (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath{} //当某一行取消选中的时候调用
      3>. UIAlertView的一些属性和代理方法
        1). UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"修改数据" message:nil delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"确定", nil]; //创建一个弹窗
        2). alert.alertViewStyle = UIAlertViewStyle...; //设置alert的样式, 让alert显示出uitextfield
        3). UITextField *textField = [alert textFieldAtIndex:0]; //获取alert中的textfield
        4). [alert show]; //显示弹窗
        5). - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{} // alertView的按钮被点击的时候就会调用

    6. 自定义cell两种方式
      1>. 纯代码:每个cell子控件的个数和位置不一样
      2>. 通过xib: cell一样且固定的界面
        加载xib的方式:
          1). [[[NSBundle mainBundle] loadNibNamed:@"xib名" owner:nil options:nil] firstObject];
          2).UINib *nib = [UINib nibWithNibName:@"xib名" bundle:nil];
            UIView *view = [[nib instantiateWithOwner:nil options:nil]firstObject];
      3>. 延迟调用
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ });
      4>.init方法只有通过代码创建控件的时候才会调用; awakeFromNib方法在控件通过xib或者storyboard创建的时候才会调用
      5>. 协议规范
        协议名称 : 控件名称 + Delegate
        协议方法名称:控件名称去掉前缀 + 含义
        在协议方法中将自己(触发发放的)控件传出去的目的是方便用于区分哪个控件触发了该方法
      6>. 代码创建的子控件,添加到contentView中 [self.contentView addSubview:子控件];
      7>. 计算文字宽高
        CGSize *maxSize = CGSizeMake(300, MAXFLOAT); // 设置文字范围
        NSDictionary *dict = @{NSFontAttributeName : font}; // 字体
        // 如果将来计算的文字的范围超出了指定的范围,返回的就是指定的范围
        // 如果将来计算的文字的范围小于指定的范围, 返回的就是真实的范围
        CGSize size = [NSString *str boundingRectWithSize:maxSize options:NSStringDrawingUsesLineFragmentOrigin attributes:dict context:nil].size; // 计算文字宽高
      8>.通过代码自定义cell的方法
        1).新建一个继承自UITableViewCell的类
        2).重写initWithStyle:reuseIdentifier:方法
          添加所有需要显示的子控件(不需要设置子控件的数据和frame,  子控件要添加到contentView中)
          进行子控件一次性的属性设置(有些属性只需要设置一次, 比如字体固定的图片)
        3).提供2个模型
          数据模型: 存放文字数据图片数据
          frame模型: 存放数据模型所有子控件的framecell的高度
        4).cell拥有一个frame模型(不要直接拥有数据模型)
        5).重写frame模型属性的setter方法: 在这个方法中设置子控件的显示数据和frame
        6).frame模型数据的初始化已经采取懒加载的方式(每一个cell对应的frame模型数据只加载一次)

    7. 通知机制
      1>. 通知中心(NSNotificationCenter)
        每一个应用程序都有一个通知中心(NSNotificationCenter)实例,专门负责协助不同对象之间的消息通信
        创建通知中心
        NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
      2>. 一个完整的通知一般包含3个属性:
        - (NSString *)name; // 通知的名称
        - (id)object; // 通知发布者(是谁要发布通知)
        - (NSDictionary *)userInfo; // 一些额外的信息(通知发布者传递给通知接收者的信息内容)
      3>. 初始化一个通知(NSNotification)对象
        + (instancetype)notificationWithName:(NSString *)aName object:(id)anObject;
        + (instancetype)notificationWithName:(NSString *)aName object:(id)anObject userInfo:(NSDictionary *)aUserInfo;
        - (instancetype)initWithName:(NSString *)name object:(id)object userInfo:(NSDictionary *)userInfo;
      4>. 通知中心(NSNotificationCenter)提供了相应的方法来发布通知
        - (void)postNotification:(NSNotification *)notification; // 发布一个notification通知,可在notification对象中设置通知的名称、通知发布者、额外信息等
        - (void)postNotificationName:(NSString *)aName object:(id)anObject; // 发布一个名称为aName的通知,anObject为这个通知的发布者
        - (void)postNotificationName:(NSString *)aName object:(id)anObject userInfo:(NSDictionary *)aUserInfo; // 发布一个名称为aName的通知,anObject为这个通知的发布者,aUserInfo为额外信息
      5>.注册通知监听器(Observer)
        - (void)addObserver:(id)observer selector:(SEL)aSelector name:(NSString *)aName object:(id)anObject;
        observer:监听器,即谁要接收这个通知
        aSelector:收到通知后,回调监听器的这个方法,并且把通知对象当做参数传入
        aName:通知的名称。如果为nil,那么无论通知的名称是什么,监听器都能收到这个通知
        anObject:通知发布者。如果为anObject和aName都为nil,监听器都收到所有的通知
      6>. 取消注册通知监听器
        通知中心不会保留(retain)监听器对象,在通知中心注册过的对象,必须在该对象释放前取消注册。否则,当相应的通知再次出现时,通知中心仍然会向该监听器发送消息。因为相应的监听器对象已经被释放了,所以可能会导致应用崩溃
        - (void)removeObserver:(id)observer;
        - (void)removeObserver:(id)observer name:(NSString *)aName object:(id)anObject;
        一般在监听器销毁之前取消注册(如在监听器中加入下列代码):
        - (void)dealloc {
          //[super dealloc]; 非ARC中需要调用此句
          [[NSNotificationCenter defaultCenter] removeObserver:self];
        }
      7>. 通知和代理的选择
        1).共同点
          利用通知和代理都能完成对象之间的通信
        2).不同点
          代理 : 一对一关系(1个对象只能告诉另1个对象发生了什么事情)
          通知 : 多对多关系(1个对象能告诉N个对象发生了什么事情, 1个对象能得知N个对象发生了什么事情)

    8. 键盘通知
      UIKeyboardWillShowNotification // 键盘即将显示
      UIKeyboardDidShowNotification // 键盘显示完毕
      UIKeyboardWillHideNotification // 键盘即将隐藏
      UIKeyboardDidHideNotification // 键盘隐藏完毕
      UIKeyboardWillChangeFrameNotification // 键盘的位置尺寸即将发生改变
      UIKeyboardDidChangeFrameNotification // 键盘的位置尺寸改变完毕
      附带跟键盘有关的额外信息(字典),字典常见的key如下:
      UIKeyboardFrameBeginUserInfoKey // 键盘刚开始的frame
      UIKeyboardFrameEndUserInfoKey // 键盘最终的frame(动画执行完毕后)
      UIKeyboardAnimationDurationUserInfoKey // 键盘动画的时间
      UIKeyboardAnimationCurveUserInfoKey // 键盘动画的执行节奏(快慢)
    9. 其他
      1>. 子控件不显示排错方法
        1).查看是否调用添加的方法
        2).frame为空(没有设置frame)
        3).hidden 是否为yes
        4).alpha <=0.1
        5).没有添加到父控件中
        6).查看夫控件有没有以上几点
        但凡在init方法中获取到的frame都是0
          - (void)layoutSubviews
          {
            [super layoutSubviews];
            // 该方法在控件的frame被改变的时候就会调用
            // 该方法一般用于调整子控件的位置
          }
      2>.
        // 已经被添加到父视图上的时候会调用
        - (void)didMoveToSuperview
        {
        }
        // 即将被添加到父视图上的时候会调用
        - (void)willMoveToSuperview:(UIView *)newSuperview
        {
        }
      3> UITextField中添加左右视图
        self.textField.leftView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 0)];
        // 设置左边视图的显示模式
        self.textField.leftViewMode = UITextFieldViewModeAlways;
        self.textField.rightView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 0)];
        // 设置右边视图的显示模式
        self.textField.rightViewMode = UITextFieldViewModeAlways;
      4>. // 设置btn中的图片不填充整个imageview
        btn.imageView.contentMode = UIViewContentModeCenter;
        // 超出范围的图片不要剪切
        // btn.imageView.clipsToBounds = NO;
        btn.imageView.layer.masksToBounds = NO;

  • 相关阅读:
    Java基础语法
    Struts2--带参数的结果集
    Struts2--Dynamic Result动态结果集
    Struts2--Global Result全局结果集
    Struts2--Result类型
    Struts2--默认Action
    Struts2--模块包含
    Struts2--访问web元素
    puppeteer 填充基础表单
    animejs 动画库
  • 原文地址:https://www.cnblogs.com/wentianblog/p/3763552.html
Copyright © 2011-2022 走看看