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

Как UITableViewCell знает свой собственный индексный пакет?

Стандартный стиль Grouped UITableView позволяет UITableViewCell рисоваться с закругленными углами вверху и внизу каждого раздела. Как это достигается? Как ячейка знает свое собственное местоположение внутри своего раздела и как она знает, когда менять закругленные края?

Я хочу создать свои собственные округленные ячейки, и у меня есть изображения для использования, но не знаю, когда показывать, какое изображение

Примечание. Я уже знаю, как работает UITableView, и я знаю, как его использовать. Я просто подумал, что, поскольку UITableView способен автоматически рисовать округленные углы в правильных местах, я тоже должен быть в состоянии, не добавляя ничего к моему источнику данных или делегату.

4b9b3361

Ответ 1

Существует sectionLocation метод UITableViewCell, который возвращает целое число говорит вам, что вам нужно:

  • 1 - средняя ячейка
  • 2 - верхняя ячейка
  • 3 - нижняя ячейка
  • 4 - одиночная клетка

У меня не было проблем с использованием этого в нескольких производственных приложениях с 2010 года.

ОБНОВЛЕНИЕ: один из наших двоичных файлов был автоматически отклонен недавно (конец 2018 года), потому что мы использовали свойство 'sectionLocation', поэтому оно больше не является хорошим вариантом.

Добавьте что-то подобное в ваши заголовочные файлы, и вы сможете использовать это:

typedef NS_ENUM(NSInteger, MMMTableViewCellLocation) {

    MMMTableViewCellLocationUndefined = 0,
    MMMTableViewCellLocationMiddle = 1,
    MMMTableViewCellLocationTop = 2,
    MMMTableViewCellLocationBottom = 3,
    MMMTableViewCellLocationSingle = 4
};

@interface UITableViewCell ()

/** Undocumented method of UITableViewCell which allows to know where within section the cell is located,
 * so the cell can draw its borders properly. */
- (MMMTableViewCellLocation)sectionLocation;

/** Override this one to know when the value of sectionLocation changes. */
- (void)setSectionLocation:(MMMTableViewCellLocation)sectionLocation animated:(BOOL)animated;

@end

Ответ 2

NSIndexPath *indexPath = [(UITableView *)self.superview indexPathForCell: self];
int rows = [(UITableView *)self.superview numberOfRowsInSection:indexPath.section];

if (indexPath.row == 0 && rows == 1) {
// the one and only cell in the section
}
else if (indexPath.row == 0) {
//top
}
else if (indexPath.row != rows - 1) {
//middle
}
else {
//bottom
}

Ответ 3

Это очень просто. предположим, что ячейка - это объект, положение которого должно быть обнаружено.

  UITableView* table = (UITableView *)[cell superview]; 
  NSIndexPath* pathOfTheCell = [table indexPathForCell:cell]; 
  NSInteger sectionOfTheCell = [pathOfTheCell section]; 
  NSInteger rowOfTheCell = [pathOfTheCell row];

Ответ 4

Вы можете использовать

- (NSIndexPath *)indexPathForCell:(UITableViewCell *)cell

для этой проблемы. В моем примере я использую это для прокрутки ячейки (с пользовательским контентом) в верхней части представления.

Ответ 5

Если вам нужны более надежные и общие вещи, взгляните на http://cocoawithlove.com/2009/04/easy-custom-uitableview-drawing.html - Мэтт Галлахер показывает, что вам нужно, довольно эффективно. Он в основном воссоздает UITableViewController из UIViewController, добавляя возможность использовать собственную графику. Я просто работаю над тем, чтобы применить это к одному из моих проектов, пока он выглядит так, как будто бы выполнит эту работу.

Ответ 6

К сожалению, я не нашел решения этой проблемы и прибегал к подклассу UITableViewController и UITableViewCell в общем решении, которое я могу расширить по мере необходимости.

Ответ 7

Вы не делаете этого в ячейке. Округлые углы рисуются в [tableView viewForHeaderInSection] и viewForFooterInSection.

То, как я это делаю, - использовать стиль таблицы Plain, затем использовать эти два вида для округлости, а ячейки - нормальные, без раундов.

Ответ 8

Не вникая в то, что рисует, вы можете узнать, какая ячейка является последней ячейкой в ​​ее секции внутри cellForRowAtIndexPath очень легко.

Вы переданы в indexPath ячейки, которую вы должны предоставить, не так ли? Вы также передали tableView.

вызовите [tableView numberofRowsInSection: indexPath.section], и если он == ([indexPath.row] -1), вы знаете, что вас попросят предоставить последнюю ячейку в этом разделе.

В момент вызова cellForRowAtIndexPath ячейка, как гарантируется, находится в переданном indexPath.

Ответ 9

Чтобы расширить ответ Даррена (который я нашел наиболее полезным, спасибо Даррену!), вы можете сделать так, чтобы перебирать все супервизоры, пока не найдете родительский UITableView. Это должно быть будущим доказательством, поскольку вы не полагаетесь на фиксированную иерархию представлений.

Я использую рекурсивный метод, который вернет UITableView, если он найдет один или вернет nil, если его нет.

- (UITableView *)parentTableViewOf:(UIView *)view {
        Class class = [view.superview class];
        NSLog(@"Class : %@", NSStringFromClass(class));

        if([view.superview isKindOfClass:[UITableView class]]) {
            return (UITableView *)view.superview;
        } else {
            return [self parentTableViewOf:view.superview];
        }

        return nil;
}

До сих пор я использовал этот, и он, похоже, работает без икоты. Надеюсь, поможет!:)

Ответ 10

Клетки не знают, куда они идут... В представлении таблицы есть ячейки. Вы тот, кто говорит о представлении таблицы WHAT, которое идет в ячейке. Вы делаете это в DataSource, где вы реализуете cellForRowAtIndexPath... Как это работает:

Индексный путь имеет строку и раздел

Для просмотра сгруппированной таблицы

Раздел относится к группе, а строка относится к 1 записи в этом разделе, способ, которым UITableView знает, сколько строк находится в разделе и сколько разделов есть, это методы методов DataOourcesOfSectionInTableView и метод numberOfRowsInSection, это сделает правильные вызовы cellForRowAtIndexPath, вам решать, какой раздел и строка запрашивается и вам нужно построить свою ячейку в соответствии с этими спецификациями.

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

Таким образом, реализация для numberOfSectionsInRows будет выглядеть как

return [[dictionary allKeys] count]

И внедрение numOfRowsInSection будет выглядеть как

NSString* key=[[dictionary allKeys] objectAtIndex:sectionNumber]
  return [[dictionary objectForKey:key] count]

Вы всегда можете обратиться к руководству по программированию UITableView на http://developer.apple.com/iphone/library/documentation/UserExperience/Conceptual/TableView_iPhone/Introduction/Introduction.html Надеюсь, что поможет

Ответ 11

Просто добавьте свойство в свой собственный класс UITableViewCell (в зависимости от реализации), который содержит int, NSNumber или NSIndexPath, определяющий, какой из них он есть. Вместо этого вы используете структуру данных, а затем помещаете ее в свой элемент в этой структуре данных. Затем вы просто устанавливаете свойство при создании структуры данных, например elt.id = i, а затем вы получаете доступ к ней в cellForRowAtIndexPath, что-то вроде if (elt.id == 0 || elt.id == n-1), где n - количество строк в вашем разделе.

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