iOS中tableView和scrollView的区别

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)

  1. 定时器创建两种方式
    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>.定义协议(三步)        
1).定义protocol(两种optional[代理对象可不实现]、required[代理对象必须实现])        
2).增加代理属性(weak) @property (weak, nonatomic) id delegate;
3).给代理发消息,调用代理的方法(需要判断代理对象是否实现了该方法,
    不判断调用后(编译时不会)会报错) 
    注意:定义协议的名称命名[类名+Delegate]、
    协议方法的命名规范[方法名称需要去掉前缀,并且将自己作为参数]
2>.使用代理(三步)
1).声明协议        
2).设置代理对象        
3).实现协议方法(本例是在代理对象[控制器] 添加一个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)integer]

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];```

  1. 优化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

  1. 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的按钮被点击的时候就会调用

  1. 自定义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模型数据只加载一次)

  1. 通知机制
    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; 一般在监听器销毁之前取消注册(如在监听器中加入下列代码):
}```
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;```
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,219评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,363评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,933评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,020评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,400评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,640评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,896评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,597评论 0 199
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,327评论 1 244
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,581评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,072评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,399评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,054评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,083评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,849评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,672评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,585评论 2 270

推荐阅读更多精彩内容

  • *7月8日上午 N:Block :跟一个函数块差不多,会对里面所有的内容的引用计数+1,想要解决就用__block...
    炙冰阅读 2,441评论 1 14
  • 1.badgeVaule气泡提示 2.git终端命令方法> pwd查看全部 >cd>ls >之后桌面找到文件夹内容...
    i得深刻方得S阅读 4,529评论 1 9
  • UITableViewCell控件空间构造 cell的子控件是contentView,contentView的子控...
    CoderZXS阅读 643评论 0 1
  • 乡村的夜色并不斑斓,黄昏来临,黑夜很快包围了这一片土地,疲惫的人似乎已经习惯了漆黑,路灯也无人开启,凉凉的雨打湿了...
    月满西楼_9b52阅读 324评论 0 1
  • 从前的你会为一个轻轻的喷嚏紧张兮兮 从前的你会为一个小小的伤口心疼不已 从前的你会为一点小病忙前跑后嘘寒问暖 从前...
    淡淡苜蓿clover阅读 125评论 0 0