UITableView是开发中最常用的UI控件, 可是需求和系统的肯定有出入,UI给的设计肯定有不同的地方,这里就分享一些经常出现的效果和一些常用到的方法,分OC和Swift。
demo常见效果,下拉放大图片、单选、多选、cell下划线位置&颜色、滚动区域、滚动指示器的位置、cell点击动画效果。。。
先来OC
删除单个cell
NSIndexPath *cellIndexPath = [self.tableView indexPathForCell:cell];
//先移除数组中的cell数据
[self.dataArr removeObject:cell.data];
[self.tableView beginUpdates];
[self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:cellIndexPath] withRowAnimation:UITableViewRowAnimationLeft];
[self.tableView endUpdates];
刷新单个cell section
// 一个cell刷新
NSIndexPath *indexPath=[NSIndexPath indexPathForRow:3 inSection:0];
[tableView reloadRowsAtIndexPaths:[NSArray arrayWithObjects:indexPath,nil] withRowAnimation:UITableViewRowAnimationNone];
// 刷新第0个section
[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationNone];
去掉多余的分割线
self.tableView.tableFooterView = [[UIView alloc] init];
使用自动布局的话,cell的高度可以自动计算,当然你也可以自己计算或者使用第三方FDTemplateLayoutCell
self.tableView.estimatedRowHeight = 68.0;
self.tableView.rowHeight = UITableViewAutomaticDimension;
避免cell重用的问题
[cell.contentView.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];
点击cell的时候,有一些操作。比如展开收起等,比起reloadData beginUpdates效果更好
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
[tableView deselectRowAtIndexPath:indexPath animated:true];
[tableView beginUpdates];
// 操作
[tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationRight];
[tableView endUpdates];
}
tableView.visibleCells 这个属性表示屏幕里看到的cell,cell在滚动的时候进行一些展示类的动画
-(void)scrollViewDidScroll:(UIScrollView *)scrollView{
for (UITableViewCell *cell in _tableView.visibleCells) {
}
}
分割线顶头,当然你可以自己画一个,很 简单也很高效,这里使用系统的
/**
* 分割线顶头
*/
-(void)viewDidLayoutSubviews
{
if ([self.tableView respondsToSelector:@selector(setSeparatorInset:)]) {
[self.tableView setSeparatorInset:UIEdgeInsetsMake(0,0,0,0)];
}
if ([self.tableView respondsToSelector:@selector(setLayoutMargins:)]) {
[self.tableView setLayoutMargins:UIEdgeInsetsMake(0,0,0,0)];
}
}
-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
if ([cell respondsToSelector:@selector(setSeparatorInset:)]) {
[cell setSeparatorInset:UIEdgeInsetsZero];
}
if ([cell respondsToSelector:@selector(setLayoutMargins:)]) {
[cell setLayoutMargins:UIEdgeInsetsZero];
}
}
Swift
class TableViewController: UITableViewController {
let str = "囧阿尔法请问哦千万不能佛问\n红企鹅王那儿我新\n奇偶企鹅我娘亲额弄起\n"
var dict: Dictionary<String , String> = [:]
override func viewDidLoad() {
super.viewDidLoad()
tableView.tableFooterView = UIView()
tableView.estimatedRowHeight = 100
tableView.rowHeight = UITableViewAutomaticDimension
}
// MARK: - Table view data source
override func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 30
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
let label = cell.contentView.viewWithTag(100) as! UILabel
label.text = str
if dict[String(indexPath.row)] == "0" {
label.numberOfLines = 0
}else {
label.numberOfLines = 1
}
return cell
}
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let cell = tableView.cellForRow(at: indexPath)
let label = cell?.contentView.viewWithTag(100) as! UILabel
// MARK: cell点击动画处理
tableView.beginUpdates()
if label.numberOfLines == 0 {
label.numberOfLines = 1
dict[String(indexPath.row)] = "1"
}else {
label.numberOfLines = 0
dict[String(indexPath.row)] = "0"
}
tableView.endUpdates()
}
// MARK: 处理cell的分割线顶头
override func viewDidLayoutSubviews() {
tableView.separatorInset = UIEdgeInsets.zero
tableView.layoutMargins = UIEdgeInsets.zero
}
override func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
cell.separatorInset = UIEdgeInsets.zero
cell.layoutMargins = UIEdgeInsets.zero
}
// MARK:利用visibleCells属性为cell添加动画
override func scrollViewDidScroll(_ scrollView: UIScrollView) {
for cell in tableView.visibleCells {
let bootv = cell.contentView.viewWithTag(200)
let imgv = bootv?.viewWithTag(201)
let rect = bootv?.convert((bootv?.bounds)!, to: nil)
var Y = UIScreen.main.bounds.size.height - (rect?.origin.y)! - 600
Y *= 0.2
if Y > 0 {
Y = 0
}
else if Y < -100 {
Y = -100
}
imgv?.frame.origin.y = Y
}
}
}
网友评论