一:UITableView
UITableView表視圖砸紊。
表示圖在我們?nèi)粘5膇OS開發(fā)中應(yīng)用非常廣泛其做。
description:UITableView繼承與UIScrollView。所以UITableView擁有UIScrollView所有的方法和屬性凌唬。UIScrollView的一些屬性和方法我就不介紹了并齐,如果有些不清楚可以查看UIScrollView基本應(yīng)用。
初始化:
UIScrollView擁有自己的初始化方法
- (instancetype)initWithFrame:(CGRect)frame style:(UITableViewStyle)style
第一種是不分組分格UITableViewStylePlain
UITableView *tableView = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain];
第二種是分組分格UITableViewStyleGrouped
UITableView *tableView = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStyleGrouped];
初始化后在self.view addSubView:tableView就可以在當(dāng)前ViewController上添加表視圖了。用鼠標(biāo)來回滑動(dòng)一下可以發(fā)現(xiàn)tableView由一行一行的cell組成况褪。
如果我們想利用tableView來創(chuàng)建我們所需要的一些視圖效果我們就要實(shí)現(xiàn)它的兩個(gè)代理方法:UITableViewDelegate(控制tableView的顯示的代理),UITableViewDataSource(控制tableView的數(shù)據(jù)顯示的代理)撕贞。你就記住UITableViewDelegate中的代理方法可以控制tableView的外形長什么樣,UITableViewDataSource中的代理方法可以控制tableView顯示的一些數(shù)據(jù)测垛。
我們需要在頭文件延展中簽訂協(xié)議捏膨。并設(shè)置簽訂代理。
tableView.delegate = self;
tableView.dataSource = self;
簽訂完代理后就需要實(shí)現(xiàn)tableviewsDataSource必須實(shí)現(xiàn)的兩個(gè)方法
@protocol UITableViewDataSource<NSObject>
@required
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;
// Row display. Implementers should *always* try to reuse cells by setting each cell's reuseIdentifier and querying for available reusable cells with dequeueReusableCellWithIdentifier:
// Cell gets various attributes set automatically based on table (separators) and data source (accessory views, editing controls)
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
@optional
這是UItableViewDataSource的頭文件食侮,第一個(gè)方法需要我們返回一個(gè)NSInterge類型的數(shù)據(jù)号涯。這里表示我們要返回一個(gè)section需要返回多少個(gè)Row。
return 10;
第二個(gè)方法需要我門返回一個(gè)UITableVIewCell
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:kTableViewCustomCellReuse];
注意:tableView在重用池中取cell之前我門必須先注冊(cè)重用池锯七×纯欤可以在VC的ViewDidLoad的方法中或者在創(chuàng)建tableView的地方注冊(cè)。
[self.nameTableView registerClass:[UITableViewCell class] forCellReuseIdentifier:kTableViewCellReuse];
運(yùn)行程序
我們可以給cell添加一些東西
UITableCell系統(tǒng)的cell 擁有imageView眉尸,textLabel久又,detailTextLabel這三個(gè)屬性我們可以對(duì)cell進(jìn)行賦一些圖片,標(biāo)題和副標(biāo)題
當(dāng)然我門也可以自定義cell 在我們自定義cell時(shí)要將我們自定義的空間添加到contentView上效五。因?yàn)閁ITableViewCell上會(huì)有一個(gè)contentView添加在cell上地消。
在這里補(bǔ)充一下如何自定義cell。
Command + N創(chuàng)建一個(gè)文件繼承UITableViewCell畏妖。
這里有幾點(diǎn)需要注意的是脉执,當(dāng)我們自定義cell時(shí)我們的初始化方法不再是initWithFrame:而是initWithStyle:reuseIdentifier:
應(yīng)為在整個(gè)cell的生命周期都不會(huì)走initWithFrame:這個(gè)方法。你可以自己打斷點(diǎn)進(jìn)行驗(yàn)證戒劫。
- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) {
// TableViewCell 默認(rèn)大小 寬320 高44
// 在初始化時(shí)半夷, cell的frame是初始值, 不能為自定義視圖布局
NSLog(@"初始化時(shí)迅细,cell的frame是%@", NSStringFromCGRect(self.frame));
}
//添加子view
_customView = [[UIView alloc] initWithFrame:CGRectZero];
_customView.backgroundColor = [UIColor orangeColor];
//contentView顯示內(nèi)容
[self.contentView addSubview:_customView];
//初始化方法中巫橄,只負(fù)責(zé)創(chuàng)建
//3. 創(chuàng)建的子試圖應(yīng)該添加在哪個(gè)父試圖
return self;
}
將自定義的控件加載到cell的contentView上。在初始化的時(shí)候不要給自空間的frame配置茵典。我們需要在layoutSubviews的方法里對(duì)自控件的frame進(jìn)行配置湘换。只有在layoutSubviews里配置才能適配多種尺寸的iphone。否則系統(tǒng)默認(rèn)只適配3.5寸的iPhone统阿。
- (void)layoutSubviews {
//千萬不要忘記 super layoutSubviews
[super layoutSubviews];
NSLog(@"%s時(shí)彩倚,cell的frame是%@",__FUNCTION__, NSStringFromCGRect(self.frame));
//layoutSubviews中, 負(fù)責(zé)給視圖布局
//不要使用cell的frame去進(jìn)行視圖布局
//使用contentView的frame進(jìn)行布局
_customView.frame = CGRectMake(0, 0, self.contentView.frame.size.width, 100);
}