如何在索引的UITableView中更改侧面Alphabet的颜色?

时间:2009-04-15 02:49:30

标签: iphone uitableview

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

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

我的问题是我的应用程序刚剥了皮黑。所以现在很难看到旁边的字母。

我无法弄清楚如何改变字母表的颜色。如果可能的话,我希望它是“白色的”。

12 个答案:

答案 0 :(得分:61)

如果您的最低iOS版本低于6.0,则可以使用sectionIndexColor的{​​{1}}属性。

  

用于表格视图的索引文本的颜色。

     

@property(非原子,保留)UIColor * sectionIndexColor

     

讨论:

     

表视图可以显示视图侧面的索引   用户更容易快速浏览表格的内容。这个   property指定用于此区域中显示的文本的颜色。


更新日期2014.1.13

我找到了一个开源第三方库:GDIIndexBar来帮助自定义索引外观。

答案 1 :(得分:32)

据我所知,遗憾的是,无法自定义索引中显示的文本的颜色,我能够最接近的是能够修改背景颜色和索引的字体。 / p>

Erica Sadun的iPhone开发者手册中有一些代码,展示了如何访问UITableViewIndex视图(一个未记录的类)。如果有的话,可以在本书的第175页找到对它的引用。这样可以访问背景颜色和字体。您可以看到与此课程here相关的非官方文档。

警告这是未记录的类的未记录使用,因此您需要谨慎使用它。

以下是食谱中的代码片段,稍作修改:

- (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视图并在某些方面进行修改。看起来该视图没有任何子视图,因此可能会使用索引标题数组进行一些自定义绘制。

它并不完美,但希望它有所帮助。

答案 2 :(得分:21)

这可以在UITableView的界面构建器中轻松更改 - 不需要使用未记录的类吗?

请参阅下面的屏幕截图,因为您可以看到字体颜色和背景颜色也可以更改。工作很好!

答案 3 :(得分:16)

适用于iOS7或更高版本:

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

答案 4 :(得分: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...

}

答案 5 :(得分:11)

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

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

效果很好 - 它与Mooglas的回答非常相似 - 但是不要使用“UITableViewIndex”这个词。

答案 6 :(得分:8)

您可以为tableView设置色调颜色。

[[UITableView appearance] setTintColor:[UIColor purpleColor]];

答案 7 :(得分:4)

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

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

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

然后在您的实现文件的viewDidAppear中,使用以下行:

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

答案 8 :(得分:3)

这是我发现的最佳解决方案,可以调整侧面索引栏的背景颜色。它适用于iOS7,可能适用于iOS6。

将此添加到viewDidLoad

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

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

答案 9 :(得分:1)

创建一个可变数组以包含备用标题标签 在

-(NSArray * )sectionIndexTitlesForTableView:(UITableView * )tableView

返回一个@“”数组,其中引号之间的空格数决定了高亮滚动条的宽度。 让“sectionIndexTitlesForTableView”调用更新标签函数。 在该函数中,从其超级视图中删除先前创建的数组中的所有标签然后创建并添加需要的标签。然后将它们添加到表格的超级视图中。

这些是将标签放置在正确位置所需的线条。

rect.origin.x = table.frame.origin.x+table.frame.size.width-rect.size.width-2;
rect.origin.y = 5+table.frame.origin.y+counter *(280-rect.size.height-([customIndexLabels count]-1))/([customIndexLabels count]-1);
if ([customIndexLabels lastObject]==thisLabel)
{
   rect.origin.y-=10;
}

希望有所帮助。它并不完美我只是不在乎自己解决它 主要问题是最后一个标签的间距不均匀。

答案 10 :(得分:1)

Swift 4.1和Xcode 9.4:

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

答案 11 :(得分:-2)

Swift版本用于未记录的字体更改:

extension NSObject {

    class func objectClassName() -> String {

        let classLongName = reflect(self.self).summary;

        let tokens = classLongName.componentsSeparatedByString(".")

        if let typeName = tokens.last {

            return typeName
        }

        return NSStringFromClass(self.dynamicType)
    }
}

func changeSectionIndexFont(tableView: UITableView) -> Void {

        let realSubviews = tableView.subviews as! [UIView]

        for subview in realSubviews {

            if subview.dynamicType.objectClassName() == "UITableViewIndex" {

                subview.setValue(UIFont(name: "OpenSans", size: 10), forKey: "font")
            }
        }
    }