如何在索引式UITableView中更改侧边字母的颜色?

47

我有一个带有字母索引的表格视图,并且在使用侧面字母表快速浏览列表。 对于那些不熟悉的人,使用的方法如下:

- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index {

我的问题是,我的应用程序刚被改成黑色皮肤。所以现在很难看到侧边的字母表。

我无法找出如何更改字母表的颜色。如果可能的话,我想把它改为白色。

12个回答

60
如果您的最低iOS版本比6.0新,则可以使用UITableViewsectionIndexColor 属性来设置表视图索引文本的颜色。
@property(nonatomic, retain) UIColor *sectionIndexColor 讨论: 表视图可以在视图的侧面显示索引,这使用户更容易快速浏览表格的内容。该属性指定要用于此区域中显示的文本的颜色。 更新日期2014.1.13 我发现一个开源的第三方库:GDIIndexBar,以帮助自定义索引外观。

完美...像魔法一样运行 :) - simply_me
很棒。我不确定为什么,在iOS 8.1中,索引的默认背景和文本颜色都是蓝色。感谢您的提示,我可以将 "self.tableView.sectionIndexBackgroundColor" 更改为白色背景。 - Mike Gledhill

32
据我所知,很不幸地无法自定义索引中显示文本的颜色。在修改索引的背景颜色和字体方面,我能做到最接近的是参考Erica Sadun的《iPhone开发者手册》中一些代码,它展示了如何访问UITableViewIndex视图(一个未公开的类)。如果您有这本书,可以在第175页找到相关内容。这个类的非官方文档可以在这里查看。请注意,这是对未公开的类进行了未记录的使用,因此在使用时需要谨慎。
下面是从该手册中提取的代码片段,稍作修改:
- (UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath {    

  for(UIView *view in [tv subviews])
  {
    if([[[view class] description] isEqualToString:@"UITableViewIndex"])
    {

      [view setBackgroundColor:[UIColor whiteColor]];
      [view setFont:[UIFont systemFontOfSize:14]];
    }
  }

  //rest of cellForRow handling...

} 

这说明了如何访问和修改UITableViewIndex视图的一些方面。看起来该视图没有任何子视图,因此可能正在使用索引标题数组进行自定义绘制。

虽然不完美,但希望能有所帮助。

保罗


3
以上迭代可以通过以下方法实现: -(void)viewDidAppear:(BOOL)animated;这将避免在每次滚动tableView时重复进行迭代。 - Brody Robertson
1
这个方法只是改变了索引的背景颜色。如果我只想改变字体的颜色而不是它们的背景,该怎么办? - Dip Dhingani
1
要更改字体的颜色(在此示例中为红色),请使用以下代码:[view performSelector:@selector(setIndexColor:) withObject:[UIColor redColor]]; - rahzark
@paulthenerd 这一行代码出错了 [view setFont:[UIFont systemFontOfSize:14]]; // view 没有任何 setFont 方法。 - SAMIR RATHOD
2
[view setFont:[UIFont systemFontOfSize:14]]; setFont对我不起作用。我们如何设置字体大小? - Sunny Patial
显示剩余3条评论

21

这个可以在UITableView的界面生成器中轻松更改 - 无需使用未记录的类?

如下所示的屏幕截图,你可以看到字体颜色和背景颜色也可以改变。工作完成了!


18

对于 iOS7 或更高版本:

self.tableView.sectionIndexColor = [UIColor whiteColor];
self.tableView.sectionIndexBackgroundColor = [UIColor clearColor];

11

我们已经成功使用了以下代码:

for(UIView *view in [tableView subviews]) {
    if([view respondsToSelector:@selector(setIndexColor:)]) {
        [view performSelector:@selector(setIndexColor:) withObject:[UIColor whiteColor]];
    }
}

这个方法运行良好,它与Mooglas的答案非常相似,但避免使用"UITableViewIndex"这个词。


11

我之前遇到了同样的问题, 但现在我找到了一种解决方法,但是这种方法使用了未记录的类和方法,所以在尝试上传到App Store之前请三思。我应该说明一下,我只在iOS5上尝试过这个方法,不知道它是否适用于之前的版本。

我借鉴并修改了Erica Saunders的菜谱示例,使其现在将文本颜色更改为红色:

- (UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath {    

  for(UIView *view in [tv subviews])
  {
    if([[[view class] description] isEqualToString:@"UITableViewIndex"])
    {
      [view performSelector:@selector(setIndexColor:) withObject:[UIColor redColor]];
    }
  }

  //rest of cellForRow handling...

}

9
您可以为tableView设置色调颜色。
[[UITableView appearance] setTintColor:[UIColor purpleColor]];

7

Swift 5:

tableView.sectionIndexColor = .red
tableView.sectionIndexBackgroundColor = .clear

也适用于Swift 5 - DeepBlue

4

有一种方法可以更改索引字母的颜色。

在您的头文件中,将UITableView声明为属性:

@property (weak, nonatomic) IBOutlet UITableView *mainTable;

然后在你的实现文件的viewDidAppear方法中,使用以下代码:

//Change the color of the UITableView index color
_mainTable.sectionIndexColor = [UIColor blackColor];

3

这是我找到的调整侧边索引栏背景颜色的最佳解决方案。它在iOS7和可能的iOS6中都有效。

将以下内容添加到您的viewDidLoad函数中:

if ([_tableView respondsToSelector:@selector(setSectionIndexColor:)]) {
    _tableView.sectionIndexBackgroundColor = [UIColor clearColor];
    _tableView.sectionIndexTrackingBackgroundColor = [UIColor whiteColor];
}

第一个是默认颜色,第二个是在滚动时的背景颜色。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接