最近新碰到了一個(gè)小需求毅糟,tableView點(diǎn)擊索引條的某一個(gè)索引時(shí)將tableView滑動(dòng)到指定的section。
?之前也做過(guò)類似的實(shí)現(xiàn)澜公,但是頁(yè)面都是比較簡(jiǎn)單姆另,直接使用tableView 的scroll to section 方法即可。
?但是這次的做了一個(gè)自定義的header懸停坟乾,需要在滑動(dòng)到指定section的時(shí)候迹辐,向下偏移一段距離,具體的偏移量就得自己計(jì)算了甚侣。
?然后神奇的發(fā)現(xiàn)在-(NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index
方法中設(shè)置tableView的偏移量竟然不起作用明吩,會(huì)被系統(tǒng)強(qiáng)制做偏移量的修正。
?如下圖:
log了tableView的偏移量之后發(fā)現(xiàn)殷费,手動(dòng)設(shè)置的偏移量確實(shí)生效了印荔,但是緊接著系統(tǒng)會(huì)重新設(shè)置一下偏移量低葫。
?導(dǎo)致在
-(NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index
方法中自定義偏移量無(wú)法達(dá)到預(yù)期效果,第一個(gè)分區(qū)會(huì)被自定義的header蓋住一部分躏鱼。
搜索后發(fā)現(xiàn)從iOS9之后在這個(gè)方法里面做自定義的滑動(dòng)總是會(huì)被系統(tǒng)做偏移量的修正氮采。
具體原因在于-(NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index
方法的返回值上。
?- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index
?{
? return index;
?}
如果返回某個(gè)index染苛,系統(tǒng)就會(huì)根據(jù)返回的這個(gè)index做偏移量的強(qiáng)制修正鹊漠。
解決辦法就是:
?- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index
?{
? return -1;
?}
返回 -1
就能取消掉系統(tǒng)的偏移量修正,不會(huì)滑動(dòng)到任何的section茶行,然后就可以自己控制tableView的偏移量啦~~~
搞定躯概。
續(xù):索引條相關(guān)樣式修改(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"];
??}
?}
修改索引條字體大小沒(méi)有public的api調(diào)用修改畔师,遍歷子控件找到UITableViewIndex
后娶靡,需要使用kvc,keypath是font
看锉。
3.修改索引條的寬度姿锭,或者修改索引條的左右間距
?同樣沒(méi)有api可以直接調(diào)用修改,可以在下面這個(gè)方法里面做一些手腳伯铣。
?- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView{
? return array;
?}
給返回的字符串?dāng)?shù)組中的字符串前后添加\t
呻此,通過(guò)修改字符串的長(zhǎng)度,來(lái)達(dá)到修改索引條寬度的要求腔寡。
?但需要注意的是焚鲜,索引條的寬度增加會(huì)影響到UITableView
的cell
寬度。
附一張UITableViewIndex
的屬性圖: