В iOS 6 мой индекс раздела UITableView будет равномерно распределять все его элементы по высоте представления таблицы. В iOS 7 все элементы сгруппированы в середине, что затрудняет доступ к элементам. Есть ли способ их освободить?
Интервал индексов раздела UITableView на iOS 7
Ответ 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;
}
И вот результат:
Ответ 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;
}
Вот один из них, который я сделал, загружая контент динамически:
Ответ 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, поэтому каждый раз, когда появляется представление, вам нужно вызвать эту процедуру, а затем перезагрузить таблицу.