iOS 7上的UITableView部分索引间距

在iOS 6上,我的UITableView的部分索引将在表视图的高度上均匀分配所有项目。 在iOS 7中,所有的项目都聚集在一起,使项目很难挖掘。 有什么办法可以把它们分开吗?

这里可能的解决scheme之一是添加一个空string,然后在每次向段索引标题数组添加实际标题之后添加空string,并在您的tableView: sectionForSectionIndexTitle: atIndex: method处返回索引除以2。

这个技巧略微增加了连续标题之间的距离,但并没有完全解决这个问题。

这是Anton Malmygin答案的一个实现,你可以通过在数组中添加更多空的itens来添加更多的空间:

首先,让我们用假索引创build一个数组。

  NSArray *array = self.mydataArray; // here are your true index self.sectionsTitle = [NSMutableArray array]; int n = array.count; // In IOS 7 all index of the items are clumped together in the middle, // making the items difficult to tap. // As workaround we added "fake" sections index // reference: https://stackoverflow.com/questions/18923729/uitableview-section-index-spacing-on-ios-7 for (int i = 0; i < n; i++){ [self.sectionsTitle addObject:array[i]]; [self.sectionsTitle addObject:@""]; } 

然后,你可以用下面的方法实现tableview委托方法:

 - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section { // In IOS 7 all index of the items are clumped together in the middle, // making the items difficult to tap. // As workaround we added "fake" sections index // reference: https://stackoverflow.com/questions/18923729/uitableview-section-index-spacing-on-ios-7 if ([sectionsTitle[section] isEqualToString:@""]){ return 0; } return x; // return your desire section height } - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { // In IOS 7 all index of the items are clumped together in the middle, // making the items difficult to tap. // As workaround we added "fake" sections index // reference: https://stackoverflow.com/questions/18923729/uitableview-section-index-spacing-on-ios-7 if ([sectionsTitle[section] isEqualToString:@""]){ return nil; }else{ // return your desire header view here, // if you are using the default section header view, // you don't need to implement this method return // return your custom view } } - (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView { return self.sectionsTitle; } - (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index { // In IOS 7 all index of the items are clumped together in the middle, // making the items difficult to tap. // As workaround we added "fake" sections index // reference: https://stackoverflow.com/questions/18923729/uitableview-section-index-spacing-on-ios-7 if ([title isEqualToString:@""]){ return -1; } return [sectionsTitle indexOfObject:title]; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { // In IOS 7 all index of the items are clumped together in the middle, // making the items difficult to tap. // As workaround we added "fake" sections index // reference: https://stackoverflow.com/questions/18923729/uitableview-section-index-spacing-on-ios-7 if ([sectionsTitle[section] isEqualToString:@""]){ return 0; } return // your logic here; } 

结果如下:

在这里输入图像说明

有一个稍微简单的方法来完成安东的build议,也可以扩展到任何数量的索引每节(而不是只有两个安东build议)。 所以你添加你想要的额外索引标题的数量。 在这个例子中,我使用了4。

所以首先你将这些东西添加到一个indexTitles数组中,在viewDidLoad或者其他的东西里。 注意:如果你正在向tableViewasynchronous添加内容,这也可以dynamic地完成,这就是为什么我添加了if语句,所以只要它不是第一个将用句点replace空string。 这样最终不会有stream浪的时期

 @property (nonatomic, strong) NSArray *indexTitles; - (void) addIndexTitle:(NSString *) indexTitle { if ([self.indexTitles count]) { NSInteger last = self.indexTitles.count; self.indexTitles[last - 1] = @"."; self.indexTitles[last - 2] = @"."; // Change the number of these depending self.indexTitles[last - 3] = @"."; // on the number of lines in the index titles } [self.indexTitles addObject:indexTitle]; [self.indexTitles addObject:@""]; // Add different strings here for multiline [self.indexTitles addObject:@""]; // index titles [self.indexTitles addObject:@""]; } 

现在我们可以使用模运算符,取决于每个索引标题有多less个string。

 - (NSInteger) tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index { index = index - index % 4; // This is the index of the section you want NSInteger newIndex = index; // do any other processing here (if need be) to determine the correct index here return newIndex; 

}

不要忘记为tableView声明节索引标题。

 - (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView { return self.indexTitles; } 

这里是我所做的dynamic加载内容的一个:

例

我发现了一个解决方法:

 - (void)setIndexUIForTableView:(UITableView*)tableView{ //UI the index view for(UIView *view in [tableView subviews]) { if([view respondsToSelector:@selector(setIndexColor:)]) { [view performSelector:@selector(setIndexColor:) withObject:[UIColor clientblack]]; if ([view respondsToSelector:@selector(setFont:)]) { [view performSelector:@selector(setFont:) withObject:[UIFont systemFontOfSize:15.0]]; [view performSelector:@selector(setBackgroundColor:) withObject:[UIColor clientsidebarGray]]; } } } } 

添加到你的方法和数据加载后

  [self setIndexUIForTableView:tableview]; [tableview reloadData]; 

我尝试了Jatin的解决方法,但结果只是在部分索引的颜色和字体的变化。 它保持垂直压缩并居中。

我认为这是iOS7的新行为(尽pipe我认为这不是最好的视觉外观)。 这种行为在Apple官方文档中也可见: iOS人机界面指南 – 表格视图

这是我玩和工作的东西。 遵循Anton M的build议,使用Swift 2和ios 9。

假设您有以下部分索引:

 let indexes: [String] = ["A", "B", "C", "D", "E"] 

所以每个人都在同一个页面上,A在索引0处.B在索引1处,依此类推。

让我们假设你想索引之间有两个空格。 然后定义您的部分索引为:

 let indexes: [String] = ["A", "", "", "B", "", "", "C", "", "", "D", "", "", "E"] 

所以现在,A仍然在索引0,但B现在在索引3,C在6,D在9,E在12。

所有你需要的是找出sectionForSectionIndexTitle中的偏移量。 你所追求的是一个真正的标题的索引,因为这是你在表中的内容。 因此:

 override func tableView(tableView: UITableView, sectionForSectionIndexTitle title: String, atIndex index: Int) -> Int { return index / 3 } 

因此,对于索引之间需要的每个额外空间,您需要将1添加到上述expression式的枚举器中。 你可以很容易地在游乐场testing这个。

我试过这个MOD,它的工作原理,但你也必须在viewDidAppear方法设置调用例程,所以每次出现的视图,你需要调用这个例程,然后重新加载你的表。