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模型: 存放数据模型\所有子控件的frame\cell的高度

    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;

时间: 2024-11-06 17:42:42

IOS学习笔记 -- scrollView和tableView整理的相关文章

IOS 学习笔记,scrollView添加分页

1 #import "ViewController.h" 2 3 #define Width self.view.frame.size.width 4 #define Height self.view.frame.size.height 5 #define viewH 200 6 @interface ViewController ()<UIScrollViewDelegate> 7 8 9 @property(nonatomic,retain) UIScrollView

iOS学习笔记-精华整理

iOS学习笔记总结整理 一.内存管理情况 1- autorelease,当用户的代码在持续运行时,自动释放池是不会被销毁的,这段时间内用户可以安全地使用自动释放的对象.当用户的代码运行告一段 落,开始等待用户的操作,自动释放池就会被释放掉(调用dealloc),池中的对象都会收到一个release,有可能会因此被销毁. 2-成员属性:     readonly:不指定readonly,默认合成getter和setter方法.外界毫不关心的成员,则不要设置任何属性,这样封装能增加代码的独立性和安全

iOS学习笔记之UITableViewController&amp;UITableView

iOS学习笔记之UITableViewController&UITableView 写在前面 上个月末到现在一直都在忙实验室的事情,与导师讨论之后,发现目前在实验室完成的工作还不足以写成毕业论文,因此需要继续思考新的算法.这是一件挺痛苦的事情,特别是在很难找到与自己研究方向相关的文献的时候.也许网格序列水印这个课题本身的研究意义就是有待考证的.尽管如此,还是要努力的思考下去.由于实验室的原因,iOS的学习进度明显受到影响,加之整理文档本身是一件耗费时间和精力的事情,因此才这么久没有写笔记了. M

iOS学习笔记(3)— 屏幕旋转

iOS学习笔记(3)— 屏幕旋转 一.屏幕旋转机制: iOS通过加速计判断当前的设备方向和屏幕旋转.当加速计检测到方向变化的时候,屏幕旋转的流程如下: 1.设备旋转时,系统接收到旋转事件. 2.系统将旋转事件通过AppDelegate通知当前的主Window. 3.window通知它的rootViewController. 4.rootViewController判断所支持的旋转方向,完成旋转. iOS系统中屏幕旋转事件没有像触碰事件那样进行hitTest,所以只有rootViewControl

iOS学习笔记(4) — UITableView的 重用机制

iOS学习笔记(4) — UITableView的 重用机制 UITableView中的cell是动态的,在使用过程中,系统会根据屏幕的高度(480)和每个cell的高度计算屏幕中需要显示的cell的个数.比如,cell高度为90.那么480 / 90 = 5 + 1,也就是说最多有6个cell能显示在屏幕中. 系统会创建1个cel池,无论tableview有多少行都只创建6个cell放在池中.当某行移出屏幕的时候,将这个cell放回在池中:当某行需要显示在屏幕中时,从池中取出一个cell. 重

iOS学习笔记20-地图(二)MapKit框架

一.地图开发介绍 从iOS6.0开始地图数据不再由谷歌驱动,而是改用自家地图,当然在国内它的数据是由高德地图提供的. 在iOS中进行地图开发主要有三种方式: 利用MapKit框架进行地图开发,利用这种方式可以对地图进行精准的控制 调用苹果官方自带的地图应用,主要用于一些简单的地图应用,无法精确控制 使用第三方地图开发SDK库 用得最多的还是MapKit,所以这节就只讲MapKit的使用. 二.MapKit核心类 MapKit的核心类为地图展示控件MKMapView,以下是常用的属性.对象方法以及

iOS学习笔记—— UItableView 控件的简单使用

UITableView 可以说是iOS开发中最常用的控件,除了游戏之外,几乎所有的应用中独会出现他的身影. 使用UITableView控件需要遵守两种协议 UITableViewDelegate和 UITableViewDataSource. 常用方法如下: 1.返回(每个分区)表单元个数(行数) - (NSInteger) tableView: (UItableView *) tableVIew numberOfRowsInSection: (NSInteger)section 2.返回表单元

代码管理工具 --- git的学习笔记四《重新整理git(1)》

1.创建版本库 mkdir  创建目录 cd  地址,到该地址下 pwd 显示当前目录 1.创建目录 $ mkdir startGit $ cd startGit $ pwd 显示当前目录 或者cd到桌面,然后再创建目录 2.初始化版本库 $ git init 初始化仓库 提示信息:Initialized empty Git repository in /Users/xingzai/Desktop/startGit/.git/ 建立一个空的git仓库在/Users/xingzai/Desktop

iOS: 学习笔记, Swift操作符定义

Swift操作符可以自行定义, 只需要加上简单的标志符即可. @infix 中置运算. 如+,-,*,/运算 @prefix 前置运算. 如- @postfix 后置运算. a++, a-- @assignment 赋值运算. +=, -=, --a, ++a // // main.swift // SwiftBasic // // Created by yao_yu on 14-7-27. // Copyright (c) 2014年 yao_yu. All rights reserved.