iOS 7上的UITableView部分索引间距

时间:2013-09-20 18:42:56

标签: iphone ios uitableview ios7

在iOS 6上,我的UITableView的部分索引会在表格视图的高度均匀分布所有项目。在iOS 7中,所有项目都在中间聚集在一起,使得项目难以点击。有没有办法将它们分开?

6 个答案:

答案 0 :(得分:7)

这里可能的解决方案之一是在每次向标题索引标题数组添加实际标题后添加空字符串,并使用tableView: sectionForSectionIndexTitle: atIndex:方法返回索引除以2。

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

答案 1 :(得分:7)

以下是Anton Malmygin答案的实现,只需在阵列上添加更多空的itens即可添加更多空间:

首先,让我们创建一个带有假索引的数组。

    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;
}

结果如下:

enter image description here

答案 2 :(得分:4)

有一种稍微简单的方法可以完成Anton的建议,也可以扩展到每个部分的任意数量的索引(而不是像Anton建议的那样只有两个)。所以你添加了你想要的额外索引标题的数量。在这个例子中,我使用了4。

首先,您要将内容添加到indexTitles数组中,viewDidLoad或其他内容。 注意:如果要向tableView添加内容,也可以动态完成此操作 异步,这就是我添加if语句的原因,只要它不是第一个 一个它将用句点替换空字符串。这样就没有流浪了 最后的时期

@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:@""];
}

现在我们可以使用模运算符,具体取决于每个索引标题的字符串数。

- (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;
}

这是我制作的一个动态加载内容:

example

答案 3 :(得分:3)

我找到了一个解决方法:

- (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];

答案 4 :(得分:1)

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

我认为这是iOS7的新行为(虽然我认为这不是最好的视觉外观)。此行为在Apple的此官方文档中也可见:iOS Human Interface Guidelines - Table View

答案 5 :(得分:-2)

我尝试了这个mod并且它可以工作,但是您还必须在viewDidAppear方法中设置调用例程,因此每次出现视图时都需要调用此例程然后重新加载表。