最近新碰到了一个小需求,tableView点击索引条的某一个索引时将tableView滑动到指定的section。
之前也做过类似的实现,但是页面都是比较简单,直接使用tableView 的scroll to section 方法即可。
但是这次的做了一个自定义的header悬停,需要在滑动到指定section的时候,向下偏移一段距离,具体的偏移量就得自己计算了。
然后神奇的发现在-(NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index
方法中设置tableView的偏移量竟然不起作用,会被系统强制做偏移量的修正。
如下图:
log了tableView的偏移量之后发现,手动设置的偏移量确实生效了,但是紧接着系统会重新设置一下偏移量。
导致在
-(NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index
方法中自定义偏移量无法达到预期效果,第一个分区会被自定义的header盖住一部分。
搜索后发现从iOS9之后在这个方法里面做自定义的滑动总是会被系统做偏移量的修正。
具体原因在于-(NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index
方法的返回值上。
- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index
{
return index;
}
如果返回某个index,系统就会根据返回的这个index做偏移量的强制修正。
解决办法就是:
- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index
{
return -1;
}
返回 -1
就能取消掉系统的偏移量修正,不会滑动到任何的section,然后就可以自己控制tableView的偏移量啦~~~
搞定。
续:索引条相关样式修改(UITableViewIndex)
1.修改索引条背景颜色,修改索引条字体颜色
tableView.sectionIndexBackgroundColor = [UIColor clearColor];
tableView.sectionIndexColor = [UIColor lightGrayColor];
2.修改索引条字体大小
for (UIView *subView in _tableView.subviews) {
if ([subView isKindOfClass:NSClassFromString(@"UITableViewIndex")]) {
[subView setValue:[UIFont systemFontOfSize:16.0] forKey:@"font"];
}
}
修改索引条字体大小没有public的api调用修改,遍历子控件找到UITableViewIndex
后,需要使用kvc,keypath是font
。
3.修改索引条的宽度,或者修改索引条的左右间距
同样没有api可以直接调用修改,可以在下面这个方法里面做一些手脚。
- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView{
return array;
}
给返回的字符串数组中的字符串前后添加\t
,通过修改字符串的长度,来达到修改索引条宽度的要求。
但需要注意的是,索引条的宽度增加会影响到UITableView
的cell
宽度。
附一张UITableViewIndex
的属性图: