去掉UItableview headerView黏性,使 UITableViewStylePlain Style 的TableView header 不浮动,像Group Style 那样固定,跟随Tableview 滚动,而不会停在顶端。
- (void)scrollViewDidScroll:(UIScrollView *)scrollView { if (scrollView == tableView) { CGFloat sectionHeaderHeight = 44; if (scrollView.contentOffset.y<=sectionHeaderHeight&&scrollView.contentOffset.y>=0) { scrollView.contentInset = UIEdgeInsetsMake(-scrollView.contentOffset.y, 0, 0, 0); } else if (scrollView.contentOffset.y>=sectionHeaderHeight) { scrollView.contentInset = UIEdgeInsetsMake(-sectionHeaderHeight, 0, 0, 0); } } }
同时关闭区头和区脚,这里用swift代码,其实和OC很容易转化的
//关闭区头区脚的粘性 func scrollViewDidScroll(scrollView: UIScrollView) { if(scrollView == self.bigTableView) { let sectionFooterHeight:CGFloat = 10 let offsetY = bigTableView?.contentOffset.y if (offsetY >= 0 && offsetY <= headerHeight) { self.bigTableView!.contentInset = UIEdgeInsetsMake(-offsetY!, 0, -sectionFooterHeight, 0); } else if (offsetY >= headerHeight && offsetY <= self.bigTableView!.contentSize.height - self.bigTableView!.frame.size.height - sectionFooterHeight) { self.bigTableView!.contentInset = UIEdgeInsetsMake(-headerHeight!, 0, -sectionFooterHeight, 0); } else if (offsetY >= self.bigTableView!.contentSize.height - self.bigTableView!.frame.size.height - sectionFooterHeight && offsetY <= self.bigTableView!.contentSize.height - self.bigTableView!.frame.size.height) { self.bigTableView!.contentInset = UIEdgeInsetsMake(-offsetY!, 0, -(self.bigTableView!.contentSize.height - self.bigTableView!.frame.size.height - sectionFooterHeight), 0); } } }
这里图方便放swift的代码了
//重置cell分割线 使之左边顶格 override func viewDidLayoutSubviews() { if((tableView?.respondsToSelector("setSeparatorInset:")) != nil) { tableView?.separatorInset = UIEdgeInsetsZero } if((tableView?.respondsToSelector("setLayoutMargins:")) != nil) { tableView?.layoutMargins = UIEdgeInsetsZero } } func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) { if(cell.respondsToSelector("setSeparatorInset:")) { cell.separatorInset = UIEdgeInsetsZero } if(cell.respondsToSelector("setLayoutMargins:")) { cell.layoutMargins = UIEdgeInsetsZero } }
试了一下,不用写 override func viewDidLayoutSubviews() 这个方法就能实现。
如tableview窗口可以显示 30 行, 我想在填充tableview 100 条数据后 选择第 50行, 能把这一行显示到窗口内, 就像手动拖滚动条到 第 50行一样,要如何实现呢?
首先使用selectRowAtIndexes: 选择行数,滚动的话tableview的superview时scrollview,scrollview可以滚动到某个position 那么就要计算这个position position = table row height * index,就得到滚动的位置了。
[self.tableView selectRowAtIndexPath:[NSIndexPath indexPathForRow:_currentRow inSection:0] animated:YES scrollPosition:UITableViewScrollPositionMiddle];
UITableViewCell自动滚动到顶部
[tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:YES];