1.如何自定义UITableViewCell
2.QQ折叠效果
3.UISearchController 搜索框
一.如何自定义UITableViewCell
步骤:
1)自己创建一个类MyCell,继承自UITableViewCell;
2)在第三问cellForRow这个方法中,把之前的凡是用到UITableViewCell的地方,全部修改成MyCell;
【Demo】-【1-CustomCell】
从本地的plist文件拿数据方法:
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Limit" ofType:@"plist"];
NSArray *array = [NSArray arrayWithContentsOfFile:filePath];
成员变量中声明的bool值,默认为NO;
二 QQ折叠
思路:
1)给每个分区自定义一个头部视图【能被点击】
//点击头部视图,响应方法
//自定义头部视图,头部视图继承自UiView
//返回自定义的分区头部视图
-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
return self.sectionHeaderArray[section];
}
//返回分区头部视图的高度
-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
return 40;
}
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
//让状态在展开和收缩之间切换
self.isAppear = !self.isAppear;
[UIView animateWithDuration:0.2 animations:^{
if (self.isAppear == YES) {
//展开,箭头旋转90度
self.imgView.transform = CGAffineTransformRotate(self.imgView.transform, M_PI_2);
}else
{
//收缩,箭头逆时针旋转90度
self.imgView.transform = CGAffineTransformRotate(self.imgView.transform, -M_PI_2);
}
}];
//刷新tableView
self.block();
}
2)根据点击头部视图来控制是够要展开还是收缩,如果是收缩,那么让该分区返回的行数为0;如果是展开状态,那么让该分区返回的行数为具体的好友个数; 【** 主要在第二问中实现 **】
3)给头部视图加一个属性BOOL值,用于记录当点击头部视图之后,是要收缩还是展开;每次点击之后,修改BOOL的值,并刷新tableView;
【Demo】-【2-QQ_ZheDie】
-
(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
//折叠效果的核心思想
SectionHeaderView *view = self.sectionHeaderArray[section];
CategoryModel *model = self.dataArray[section];
return view.isAppear?model.friends.count:0;
}
三 搜索
搜索出结果后,传入一个需要展示的数组(携带数据),在一个独立的tableView中展示出来的;
-(void)creatSearchBar
{
//创建显示搜索结果的控制器对象
self.sResultVC = [[SearchResultTableViewController alloc] init];
//1.创建一个UISearchControler对象,并制定显示搜索结果的tableView
self.searchController = [[UISearchController alloc] initWithSearchResultsController:self.sResultVC];
//2.将搜索控制器跟当前的self进行关联
self.searchController.searchResultsUpdater = self;
//3.searchBar自适应位置
[self.searchController.searchBar sizeToFit];
//4.把searchBar显示self.tableView在头部视图
self.tableView.tableHeaderView = self.searchController.searchBar;
//5.表示该视图控制器的视图是否被覆盖
self.definesPresentationContext = YES;
}
pragma mark -UISearchResultsUpdating
//当用户输入文本的时候开始调用
-
(void)updateSearchResultsForSearchController:(UISearchController *)searchController
{
NSLog(@"%@",searchController.searchBar.text);
//把搜索出来的符合条件的结果存在一个数组中
NSMutableArray *resultArray = [NSMutableArray array];
for (CategoryModel *model in self.dataArray) {
for (FriendsModel *fModel in model.friends) {//字符串的查找 NSRange range = [fModel.name rangeOfString:searchController.searchBar.text]; if (range.length>0) { //找到了符合条件的fModel,然后加入数组中 [resultArray addObject:fModel]; } }
}
//将搜索之后的结果交给显示搜索结果的控制器显示出来
self.sResultVC.resultArray = resultArray;
[self.sResultVC.tableView reloadData];
}
根据字符串长度重新计算frame
//第一个参数:最大的宽和最大的高度,达不到这个高度会自动缩小 是进行自适应的尺寸
//第二个参数 option 布局格式 NSStringDrawingUsesLineFragmentOrigin
option:文本绘制时的附加选项
有四种类型:
1.NSStringDrawingTruncatesLastVisibleLine :
2.NSStringDrawingUsesLineFragmentOrigin :
- NSStringDrawingUsesFontLeading :
- NSStringDrawingUsesDeviceMetrics :
通常使用NSStringDrawingUsesLineFragmentOrigin,如果options参数为NSStringDrawingUsesLineFragmentOrigin,那么整个文本将以每行组成的矩形为单位计算整个文本的尺寸。
如果为NSStringDrawingTruncatesLastVisibleLine或者NSStringDrawingUsesDeviceMetric,那么计算文本尺寸时将以每个字或字形为单位来计算
如果为NSStringDrawingUsesFontLeading则以字体间的行距(leading,行距:从一行文字的底部到另一行文字底部的间距。)来计算
//第三个参数:将文本UIFront存入字典传到这里 字符串的属性
字典@{NSFontAttributeName:[UIFont systemFontOfSize:17]};
//第四个参数:context:context上下文。包括一些信息,例如如何调整字间距以及缩放。最终,该对象包含的信息将用于文本绘制。该参数可为 nil
CGRect rect = [str1 boundingRectWithSize:CGSizeMake(320, 10000) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName: [UIFont systemFontOfSize:17]} context:nil];