问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

ios 中tableview和scrollView的区别

发布网友 发布时间:2022-04-30 14:15

我来回答

1个回答

热心网友 时间:2022-04-22 13:44

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 scheledTimerWithTimeInterval: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;
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
女生多大后可以不在长身高? 如何不用软件把手机投屏到电脑上手机屏幕怎样投放到电脑上 战时拒绝、故意延误军事订货罪既遂的处罚? 战时故意延误军事订货罪处罚标准 名师1+1导读方案:汤姆·索亚历险记目录 三星sm-g7200打开微信慢,无法正常收看,网速不慢。 笔记本电脑如何调亮屏幕亮度 大伙说说洗衣机要不要带烘干好 热烘干洗衣机怎么样 ef英语哪个好 ios 约束怎么获取frame ios 做转场动画的时候,视图内部的控件frame不变怎么回事 ios 展示产品明细用什么组件 bound与frame有什么区别 ios contentoffset和contentinset的区别 iOS中frame 与bounds 的含义 采购部门如何提高效率,创造更大效益的工作举措? 深入探究frame和bounds的区别以及setbounds使用 IOS开发面试题 UIView的frame和bounds属性的真正的区别 详解iOS开发中frame和Bounds之间的区别 ios frame和bounds的区别 华为维修点是免费的吗 社保部门的业务咨询电话是多少? 深圳社保局怎么转不了人工? 普法栏目剧螳螂捕蝉阿晶扮演者是谁? 社保24小时咨询电话? CCTV12普法栏目剧《重拳插翅难飞》里的梁宜君是谁演的? 成都社保电话12333怎么转人工 白鸽普法栏目剧演员表勇往是谁扮演的 12333社保怎样转人工 ios判断设备是iphone还是ipad iOS view圆角设置同时又不影响子视图超出父视图部分显示 ios怎样查询图形界面对应的代码 北京故宫单向参观路线 papership可以在安卓上用吗 故宫的最佳游览路线是什么? 周公解梦:梦见我朋友死了,我又把她救活了。是怎么回事 梦到人死了,又被我救活了代表什么? 梦见有人自杀,但又救活了 梦见死人被我救活怎么解,求解谢谢 梦见看到一个人活活窒息而死,意味着什么? 怎么接空调外机线,看图 智能学习机哪个品牌好? 人工智能会“碾压”人类吗? 手机可不可以在线听歌?不用下载的那种。 手机上不用下载就能听歌的网页 手机上怎样不下载就可以听歌 有没有用手机在线听歌不用自动下载的播放器啊 拼多多安装智能锁平台有哪些 全国安装指纹锁接单平台有哪些?我想在淘宝上卖智能锁,安装售后,哪个平台能处理?