快上网专注成都网站设计 成都网站制作 成都网站建设
成都网站建设公司服务热线:028-86922220

网站建设知识

十年网站开发经验 + 多家企业客户 + 靠谱的建站团队

量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决

ios开发表格控件,ios 列表控件

iOS表格控件开发

你做过表格页面的开发吗?

成都创新互联公司专注于企业营销型网站建设、网站重做改版、喀左网站定制设计、自适应品牌网站建设、H5高端网站建设成都商城网站开发、集团公司官网建设、外贸网站制作、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为喀左等各大城市提供网站开发制作服务。

在网上看到两个实现demo,可以说是两种方式实现的。

大致就是顶部的航标题用一个TopCollectionView封装实现,底部的表格使用JContentTableView封装实现,tableViewCell里是一个collectionView,每一行有一个collectionView,稍微自己处理下数据源还是可以使用的。

大致就是自己封装了一个view,视图由LeftTableView,RightTableView,TopScrollView实现。

RightTableViewCell里是scrollView,使用的按钮实现的表格的效果。看完这个实现还是不推荐吧。

暂时只是学习了下实现,后续有啥问题更新吧~~~

ios UITableView 方法详解

**UITableView** : UIScrollView

1.创建一个UITableView对象

UITableView *tableView = [[UITableView alloc]initWithFrame:[[UIScreen mainScreen] bounds] style:UITableViewStylePlain];

2.separatorColor

分割线颜色     tableView.separatorColor = [UIColor redColor];

3.rowHeight

调整每个cell 点高度(默认 44)  tableView.rowHeight = 60;

4.reloadData

刷新数据     [tableView reloadData];

5.

两个必须实现的方法 

1).控制一个section中cell 的多少

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

2).控制cell中的内容

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

6.选中cell时候使用的方法

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

7.取消选中时候用的方法 (不常用)

- (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath

8.控制分区个数

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView

9.section上Header显示的内容

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section

10.section上Footer显示的内容

- (NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section

11.section顶部的高度

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section

12.cell的高度

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

13 该方法返回值用于在表格右边建立一个浮动的索引

- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView;

cell相关:

1.返回表格中指定indexPath对应的cell

- (UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath *)indexPath;

2.返回指定cell的indexPath

- (NSIndexPath *)indexPathForCell:(UITableViewCell *)cell;

3.返回表格中指定点所在的indexPath

- (NSIndexPath *)indexPathForRowAtPoint:(CGPoint)point;

4.返回表格中指定区域内所有indexPath 组成的数组

- (NSArray *)indexPathsForRowsInRect:(CGRect)rect;

5.返回表格中所有可见区域内cell的数组

- (NSArray *)visibleCells;

6.返回表格中所有可见区域内cell对应indexPath所组成的数组

- (NSArray *)indexPathsForVisibleRows;

7.控制该表格滚动到指定indexPath对应的cell的顶端 中间 或者下方

- (void)scrollToRowAtIndexPath:(NSIndexPath *)indexPath atScrollPosition:(UITableViewScrollPosition)scrollPosition animated:(BOOL)animated;

8.控制该表格滚动到选中cell的顶端 中间 或者下方

-(void)scrollToNearestSelectedRowAtScrollPosition:(UITableViewScrollPosition)scrollPosition animated:(BOOL)animated;

**处理单元格的选中**

1.@property(nonatomic) BOOL allowsSelection   控制该表格是否允许被选中

2.@property(nonatomic) BOOL allowsMultipleSelection  控制该表格是否允许多选

3.@property(nonatomic) BOOL allowsSelectionDuringEditing;  控制表格处于编辑状态时是否允许被选中

4.@property(nonatomic) BOOL allowsMultipleSelectionDuringEditing   控制表格处于编辑状态时是否允许被多选

5.获取选中cell对应的indexPath

- (NSIndexPath *)indexPathForSelectedRow;

6.获取所有被选中的cell对应的indexPath组成的数组

- (NSArray *)indexPathsForSelectedRows

7.控制该表格选中指定indexPath对应的表格行,最后一个参数控制是否滚动到被选中行的顶端 中间 和底部

- (void)selectRowAtIndexPath:(NSIndexPath *)indexPath animated:(BOOL)animated scrollPosition:(UITableViewScrollPosition)scrollPosition;

8.控制取消选中该表格中指定indexPath对应的表格行

- (void)deselectRowAtIndexPath:(NSIndexPath *)indexPath animated:(BOOL)animated;

9.当用户将要选中表格中的某行时触发方法

- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath;

10.当用户完成选中表格中的某行时触发方法

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath*)indexPath

11.当用户将要取消选中表格中某行时触发

- (NSIndexPath *)tableView:(UITableView *)tableView willDeselectRowAtIndexPath:(NSIndexPath *)indexPath

12.当用户完成取消选中表格中某行时触发

- (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath*)indexPath

关于对表格的编辑

1.对表格控件执行多个连续的插入,删除和移动操作之前调用这个方法开始更新

- (void)beginUpdates;

2.对表格控件执行多个连续的插入,删除和移动操作之后调用这个方法结束

- (void)endUpdates;

3.在一个或多个indexPath处插入cell

- (void)insertRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation;

4.删除一个或多个indexPath处的cell

- (void)deleteRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation;

5.将制定indexPath处的cell移动到另个一indexPath处

- (void)moveRowAtIndexPath:(NSIndexPath *)indexPath toIndexPath:(NSIndexPath*)newIndexPath

6.指定的indexSet所包含的一个或多个分区号对应的位置插入分区

- (void)insertSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation;

7.删除指定indexSet所包含的一个或多个分区号所对应的分区

- (void)deleteSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation;

8.将指定分区移动到另一个位置

- (void)moveSection:(NSInteger)section toSection:(NSInteger)newSection

**@protocol UITableViewDataSource**

9.该方法返回值决定指定indexPath对应的cell是否可以编辑

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath*)indexPath;

10.该方法返回值决定指定indexPath对应的cell是否可以移动

- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath*)indexPath;

11.当用户对指定表格行编辑(包括插入和删除)时触发该方法

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath*)indexPath;

12.该方法触发移动通常对数据进行处理(重要)

- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath*)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath;

**@protocol UITableViewDelegate**

13.开始/完成 编辑时调用的两个方法

- (void)tableView:(UITableView*)tableView willBeginEditingRowAtIndexPath:(NSIndexPath *)indexPath;

- (void)tableView:(UITableView*)tableView didEndEditingRowAtIndexPath:(NSIndexPath*)indexPath;

14.该方法返回值决定了 indexPath处的cell 的编辑状态返回值为枚举类型 分别为 None Delete Insert

- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath;

15.该方法决定了 cell处于被编辑状态时是否应该缩进若未重写 所有cell处于编辑状态时都会缩进

- (BOOL)tableView:(UITableView *)tableView shouldIndentWhileEditingRowAtIndexPath:(NSIndexPath *)indexPath;

**UITableViewCell** : UIView

这里涉及到自定义UITableViewCell 以下为具体步骤以及需要注意到地方

1.首先创建一个类继承UITableViewCell

2.把自定义cell上到自定义视图全部设置为属性(注意:属性名一定不要和系统属性命重复 e.g.imageView,textLable,detailTextLable)

3.在cell的初始化方法中 对自定义视图对属性初始化,在初始化对时候可以不指定frame(注意,这里加载到视图上时 加载到contentView 上同时注意内存管理)

4.在layoutSubviews方法中完成最后操作 通常给出frame(注意,这个方法为系统自带方法,当一个cell显示到屏幕上之前,最后调用到一个方法, 所有cell到操作 包括赋值,调整高度等 都已经完成一定不要忘记[super layoutSubviews];)

附加:当一个cell被选中的方法

- (void)setSelected:(BOOL)selected animated:(BOOL)animated

一些小操作:

//将单元格的边框设置为圆角

cell.layer.cornerRadius = 12;

cell.layer.masksToBounds = YES;

北大青鸟设计培训:北大青鸟校区IOS课程介绍?

你知道吗?IOS软件工程师已经成为软件人才中的紧缺型人才!

国内外出现大量的“IOS人才荒”,未来几年IOS人才需求缺口将达百万!

招聘网站上,IOS软件工程师依然成为各大企业哄抢的对象,不少企业为招聘这类人才,不惜花重金招揽,腾讯、联想、新浪等国内企业也毫不例外地争夺IOS软件工程师,很多IOS开发岗位年薪已高达几十万!

课程内容

内容介绍

预备阶段

1、文件管理器Finder

2、iWork使用Numbers,Keynote,Pages

3、Safari浏览器

?

?

MacOs的使用,iWork的使用

iOS开发基础

1、iOS开发的系统环境介绍、Xcode集成开发环境详解、常用软件的介绍

2、数据类型、常量和变量、运算符、赋值语句和表达式;分支、循环

3、函数,数组(一维数组、二维数组、多维数组),结构体

4、指针数组、数组指针,结构体指针

5、指向指针的指针,宏定义、枚举,const,static

?

?

?

1、Xcode、SVN

2、C语言是iOS开发的入门基础语言,本部分主要介绍C语言的基本语法,程序结构,以及指针的各种操作。

为接下来Objective-C语言的学习打下基础。

?

1、面向对象(OOP)和面向过程、类(Class)和对象(Object)、类的定义

2、创建对象、self和super关键字、属性以及点语法(nonatomic,assign、retain、copy,readonly、readwrite)

3、便利构造器、单例(Singleton)

4、堆栈、内存管理(alloc、copy、retain,release、autorelease,strong、weak)

5、键值编码(KVC)、键值监听(KVO)、通知(NSNotification)

6、类目(Category)、延展(Extention)、协议(protocol)

?

?

?

?

?

?

?

Objective-C是iOS与MacOS开发的主要语言,它是对C语言的扩展,并融入了面向对象的特点。

包含封装、继承、多态三大特性,本部分主要介绍OC的基本语法,新的特性,内存管理等内容

?

1、字符串(NSStringNSMutableString)、数值对象(NSNumberNSValue)

2、数组(NSArray,NSMutableArray)、字典(NSDictionary,NSMutableDictionary)、集合(NSSet,NSMutableSet)、快速枚举(for?in)NSIndexPath

3、日期与时间(NSDate)、日期格式(NSDataFormatter)、日历(NSCalendar)、定时器(NSTimer)

4、文件管理(NSFileManager)、程序包(NSBundle)、缓冲区(NSData)

5、网络连接(NSURLConnection)、网络地址(NSURL)、网络请求(NSURLRequest)、请求回应(NSResponse)、错误信息处理(N0SError)

6、MVC编程,简单控件一:标签(UILabel)、文本输入(UITextField)、按钮(UIButton)、提示框(UIAlertView、UIActionSheet

7、使用面向对象OOP方法,实施计算机APP应用.要求学员应用前期学习中的大部分知识点

?

?

?

?

?

iOS的基础框架,包含了iOS开发的基本数据类型,在iOSSDK中几乎部NS开头的类都属于这个框架,我们将详细介绍开发中常用的类。

iOS开发

1、窗口(UIWindow)、视图(UIView)、应用程序(UIApplication)

2、绘图(drawRect)、QuartzCoreDemo、CGContextRef

3、触摸(UITouch)、事件(UIEvent)、手势(UIGestureRecognizer)、UIResponder、消息传递、响应者链

4、UIView以及CALayer动画(CAAnimation、CABasicAnimation、CAKeyFrameAnimation)

5、活动提示(UIActivityIndicatorView)、图像(UIImageView)

6、控件二:滚动视图(UIScrollView)、页控制器(UIPageControl)、开关(UISwitch)、单选(UISegmentControl)、滑块(UISlider)

7、控件三:多行文本(UITextView)、网页视图(UIWebView)、滚轮(UIPickerView)、日期滚轮(UIDatePickerView)、表格视图(UITableView)、表格项(UITableViewCell)

8、视图控制器(UIViewController)、导航控制器(UINavigationController)、标签控制器(UITabBarController)、表格控制器(UITableViewController)、相册控制器(UIImagePickerController)

?

?

?

?

?

?

?

?

?

?

?

?

?

?

UIKit处于Cocoa四层结构的上层CocoaTouch层,是iOS开发中的控件框架,定义了几乎部可视化控件,在iOS开发中占据地位,我们不会学习各个控件的用法,而且会讲述各个控件在不同版本系统里的样式,教大家如何自定义控件样式。

学完他们我们就可以做自己个性化的界面了。

结合前期所学知识,应用UIKit框架详解中所学的UI控件及知识点,模拟实现Safari浏览器

iPhoneSafari浏览器原型App。

1、音频播放(AVAudioPlayer)、视频播放(MPMoviePlayerViewController)以及播放ipod音乐

2、照相机(UIImagePickerController)以及相册的使用

3、短信(MFMessageComposeViewController)、邮件(MFMailComposeViewController)的使用

4、加速计(UIAccelerometer)的使用、帐号注册、真机调试、上传程序

5、地图(MKMapView)的使用以及定位(CoreLocation)

6、数据持久化(文件读写、sqlite数据库、归档、NSCoding协议)、云存储(iCloud)

7、多线程开发(NSThread、NSLock),操作队列(NSOperationQueue)

8、网络请求(GET、POST)、xml解析、json解析、Socket编程

?

iOS应用特性框架是对上述两个框架之外其他框架的统称。

主要课程内容为:音频、视频的播放、照相机的使用、加速计的应用,地图框架的使用、短信、邮件的应用等等,而且也会介绍当前应用开发中使用非常广泛的开源框架,同时还将讲解开发者帐号的注册、真机调试、以及程序上传。

iOS游戏开发

1、Cocos2DHelloWorld,CCDirector(导演类),CCScene(场景类),CCLayer

2、CCSprite(精灵类),CCAction(动作)

3、CCMemu(菜单),CCLabelTTF(标签)

4、CCPointParticleSystem(点粒子系统)

5、练习:植物大战僵尸游戏开发

?

2D游戏引擎的使用,部课程内容以"植物大战僵尸"为例,贯穿其中

1、在Xcode下编译C++程序,C++类Class,成员变量,成员函数,对象的创建

2、构造函数与析构函数,newdelete关键字,内存管理

3、继承,函数重载,操作符重载,拷贝构造

4、模版template与泛型

5、Objective-C与C++混合编程

?

C++是目前流行的开发语言之一,C++基本语法,C++面象对像的特性.在XCode下如何使用C++语言编程.

1、物理世界(b2World),刚体(b2Body),精灵与刚体连接

2、碰撞测试(b2ContactListener)

3、刚体的连接关节(b2Joint)

4、练习:愤怒的小鸟开发

5、OpenGLES开发基础

?

iOS游戏开发中使用多的物理引擎,以愤怒的小鸟为例学习Box2D开发.

项目实训

项目会用到网络、数据库、各种常用控件、以及各种Foundation类。

目前有很多项目可以选择使用,比如:互动百科(新闻类应用)、乐视(电影类应用)、创业邦(杂志类应用)、尚品网(购物类应用)、雅座空间(团购类应用)、找地(定位类应用)、我是数学家(教育类应用)、YY客户端(语音类应用)、麦咨达(条码扫描类应用)、中国建行(银行类应用)、CuteMath(游戏类应用)、车震摇摇乐(娱乐类应用)、新浪微博(微博类应用)等等

老师程带领学生做一个真实项目,从需求分析开始带起,然后技术调研,工期评估、编码、测试、优化代码、上传程序等项目内容会包括几点:网络数据解析、团队协调、版本管理、制作文档、复杂表布局、制作CELL类、动画应用、定位、方向地址解析、百度地图应用

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去做

2scrollView的代理使用

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) idLFAppInfoViewDelegate 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;

ios 开发scrollview被上移怎样实现上拉刷新

1、在TableView里,一打开软件,我们就调用下拉刷新事件。

- (void)viewDidLoad {

[super viewDidLoad];

// 集成刷新控件

[self setupRefresh];

}

/**

* 集成下拉刷新

*/

-(void)setupRefresh

{

//1.添加刷新控件

UIRefreshControl *control=[[UIRefreshControl alloc]init];

[control addTarget:self action:@selector(refreshStateChange:) forControlEvents:UIControlEventValueChanged];

[self.tableView addSubview:control];

//2.马上进入刷新状态,并不会触发UIControlEventValueChanged事件

[control beginRefreshing];

// 3.加载数据

[self refreshStateChange:control];

}

2、接下来,我们就要实现 refreshStateChange 这个方法,在里面显示数据和关闭下拉刷新。

/**

* UIRefreshControl进入刷新状态:加载最新的数据

*/

-(void)refreshStateChange:(UIRefreshControl *)control

{

// 3.发送请求

AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager];

[mgr GET:@"" parameters:nil success:^(AFHTTPRequestOperation *operation, NSDictionary *responseObject){

//1.获取数据,处理数据,传递数据给tableView,如:

// 将最新的微博数据,添加到总数组的最前面

// NSRange range = NSMakeRange(0, newStatuses.count);

// NSIndexSet *set = [NSIndexSet indexSetWithIndexesInRange:range];

// [self.statuses insertObjects:newStatuses atIndexes:set];

//2.刷新表格

[self.tableView reloadData];

// 3. 结束刷新

[control endRefreshing];

} failure:^(AFHTTPRequestOperation *operation, NSError *error) {

// 结束刷新刷新 ,为了避免网络加载失败,一直显示刷新状态的错误

[control endRefreshing];

}];

}

上拉刷新

上拉刷新,一般用于分页请求,拉到底后,自动加载下一页。下面就拿加载新浪微博数据为例。

一、由于下载加载更多数据,是一个不变的布局控件,我们就用xib来实现。

HWLoadMoreFooter.h

#import UIKit/UIKit.h

@interface HWLoadMoreFooter : UIView

+(instancetype)footer;

@end

HWLoadMoreFooter.m

#import "HWLoadMoreFooter.h"

@implementation HWLoadMoreFooter

+(instancetype)footer

{

return [[[NSBundle mainBundle] loadNibNamed:@"HWLoadMoreFooter" owner:nil options:nil] lastObject];

}

@end

接着,我们建立一个名为HWLoadMoreFooter的xib

接下来,需要设置下面三个地方:

接着在框里拖拉一个Label,设置Label为填充整个view

最后,点击下图红色框,Update Frames

xib建好之后,下面我们来实现上拉刷新的代码

二.实现代码。

1.在TabelView中加载时,先加载该控件

- (void)viewDidLoad {

[super viewDidLoad];

// 集成下拉刷新控件

[self setupUpRefresh];

// 集成上拉刷新控件

[self setupDownRefresh];

}

2.集成上拉刷新方法

/**

* 集成上拉刷新

*/

-(void)setupDownRefresh

{

HWLoadMoreFooter *footer = [HWLoadMoreFooter footer];

footer.hidden = YES;

self.tableView.tableFooterView = footer;

}

3.异步请求数据方法

- (void)loadMoreStatus

{

// 1.请求管理者

AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager];

// 2.拼接请求参数

HWAccount *account = [HWAccountTool account];

NSMutableDictionary *params = [NSMutableDictionary dictionary];

params[@"access_token"] = account.access_token;

// 取出最后面的微博(最新的微博,ID最大的微博)

HWStatus *lastStatus = [self.statuses lastObject];

if (lastStatus) {

// 若指定此参数,则返回ID小于或等于max_id的微博,默认为0。

// id这种数据一般都是比较大的,一般转成整数的话,最好是long long类型

long long maxId = lastStatus.idstr.longLongValue - 1;

params[@"max_id"] = @(maxId);

}

// 3.发送请求

[mgr GET:@"" parameters:params success:^(AFHTTPRequestOperation *operation, NSDictionary *responseObject) {

// 将 "微博字典"数组 转为 "微博模型"数组

NSArray *newStatuses = [HWStatus objectArrayWithKeyValuesArray:responseObject[@"statuses"]];

// 将更多的微博数据,添加到总数组的最后面

[self.statuses addObjectsFromArray:newStatuses];

// 刷新表格

[self.tableView reloadData];

// 结束刷新(隐藏footer)

self.tableView.tableFooterView.hidden = YES;

} failure:^(AFHTTPRequestOperation *operation, NSError *error) {

HWLog(@"请求失败-%@", error);

// 结束刷新

self.tableView.tableFooterView.hidden = YES;

}];

}

4.实现scrollViewDidScroll

- (void)scrollViewDidScroll:(UIScrollView *)scrollView

{

// scrollView == self.tableView == self.view

// 如果tableView还没有数据,就直接返回

if (self.statuses.count == 0 || self.tableView.tableFooterView.isHidden == NO) return;

CGFloat offsetY = scrollView.contentOffset.y;

// 当最后一个cell完全显示在眼前时,contentOffset的y值

CGFloat judgeOffsetY = scrollView.contentSize.height + scrollView.contentInset.bottom - scrollView.height - self.tableView.tableFooterView.height;

if (offsetY = judgeOffsetY) { // 最后一个cell完全进入视野范围内

// 显示footer

self.tableView.tableFooterView.hidden = NO;

// 加载更多的微博数据

[self loadMoreStatus];

}

}


当前文章:ios开发表格控件,ios 列表控件
网页URL:http://6mz.cn/article/dscdeeo.html

其他资讯