索引选中方法中设置tableView的偏移量无效果(sectionForSectionIndexTitle)。续:UITableViewIndex相关样式修改。

最近新碰到了一个小需求,tableView点击索引条的某一个索引时将tableView滑动到指定的section。
 之前也做过类似的实现,但是页面都是比较简单,直接使用tableView 的scroll to section 方法即可。
 但是这次的做了一个自定义的header悬停,需要在滑动到指定section的时候,向下偏移一段距离,具体的偏移量就得自己计算了。
 然后神奇的发现在-(NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index方法中设置tableView的偏移量竟然不起作用,会被系统强制做偏移量的修正。
 如下图:

索引选中方法中设置tableView的偏移量无效果(sectionForSectionIndexTitle)。续:UITableViewIndex相关样式修改。_第1张图片
滑动无法控制.gif

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的偏移量啦~~~

索引选中方法中设置tableView的偏移量无效果(sectionForSectionIndexTitle)。续:UITableViewIndex相关样式修改。_第2张图片
自己控制偏移量.gif

搞定。

续:索引条相关样式修改(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,通过修改字符串的长度,来达到修改索引条宽度的要求。
 但需要注意的是,索引条的宽度增加会影响到UITableViewcell宽度。

附一张UITableViewIndex的属性图:

索引选中方法中设置tableView的偏移量无效果(sectionForSectionIndexTitle)。续:UITableViewIndex相关样式修改。_第3张图片
UITableViewIndex属性1.png
UITableViewIndex属性2.png

你可能感兴趣的:(索引选中方法中设置tableView的偏移量无效果(sectionForSectionIndexTitle)。续:UITableViewIndex相关样式修改。)