Подтвердить что ты не робот

Интервал индексов раздела UITableView на iOS 7

В iOS 6 мой индекс раздела UITableView будет равномерно распределять все его элементы по высоте представления таблицы. В iOS 7 все элементы сгруппированы в середине, что затрудняет доступ к элементам. Есть ли способ их освободить?

4b9b3361

Ответ 1

Одно из возможных решений здесь - добавить пустую строку сразу после каждого добавления реального заголовка в массив заголовков раздела и вернуть индекс, деленный на 2, по вашему методу tableView: sectionForSectionIndexTitle: atIndex:.

Этот трюк немного увеличивает расстояние между последовательными заголовками, но не полностью решает эту проблему.

Ответ 2

Вот реализация Антона Мальмигина, вы можете добавить больше места, просто добавив в массив больше пустых 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

Ответ 3

Существует несколько более простой способ завершить предложение Антона, также он может быть расширен до любого числа индексов в разделе (вместо того, чтобы иметь только два, как предложил Антон). Таким образом, вы добавляете количество дополнительных индексов, которые вы хотите. В этом примере я использовал 4.

Итак, сначала вы добавляете вещи в массив indexTitles в viewDidLoad или что-то еще. ПРИМЕЧАНИЕ. Это также можно сделать динамически, если вы добавляете контент в таблицуView асинхронно, поэтому я добавил оператор 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:@""];
}

Теперь мы можем просто использовать оператор modulo в зависимости от того, сколько строк у нас есть на индекс Title.

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

Ответ 4

я нашел обходное решение:

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

Ответ 5

Я пробовал обходное решение Jatin, но результатом было только изменение цвета и шрифта индекса раздела. Он остается вертикально сжатым и центрированным.

Я думаю, что это новое поведение iOS7 (хотя я думаю, что это не лучший внешний вид). Это поведение видно и в этом официальном документе от Apple: Руководства по интерфейсу iOS для iOS - представление таблицы

Ответ 6

Вот что я играл и работает. Он следует совету Антона М, использует 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.

Все, что вам нужно, это выяснить смещение в разделеForSectionIndexTitle. То, что вам нужно, - это индекс реального названия, так как это то, что у вас есть в вашей таблице. Поэтому:

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

Итак, для каждого дополнительного пространства, которое вам нужно между индексами, вам нужно добавить 1 к перечислителю указанного выражения. Вы можете легко проверить это на Playground.

Ответ 7

Я пробовал этот мод, и он работает, но вы также должны установить вызов подпрограммы в методе viewDidAppear, поэтому каждый раз, когда появляется представление, вам нужно вызвать эту процедуру, а затем перезагрузить таблицу.