Можно ли изменить высоту строк-заполнителей в UITableView без создания фиктивной строки? - PullRequest
5 голосов
/ 06 декабря 2011

Высота строки за последней строкой в ​​TableView ( пустых строк-заполнителей, которые предназначены только для визуальной детализации, если количество элементов меньше, чем количество строк, которые TableView может отображать за один раз ), составляетвсегда совпадает с высотой последней строки.

Можно ли это изменить, не прибегая к добавлению фиктивной последней строки?

Screenshot

Ответы [ 2 ]

1 голос
/ 06 декабря 2011

Закрытый UITableView метод экземпляра _spacingForExtraSeparators возвращает высоту строк-заполнителей. Если вы не пишете приложение для App Store, просто переопределите это. Возвращает CGFloat.

Вот другой подход, который совместим с App Store (насколько я знаю) и может быть проще, чем создание фиктивной строки.

UITableView часто отправляет себе сообщение layoutSubviews. Он делает это всякий раз, когда добавляет, удаляет или переставляет ячейки, и всякий раз, когда он прокручивает (и, вероятно, также в другое время). Итак, давайте переопределим layoutSubviews, чтобы нарисовать представление, которое начинается у нижнего края последнего раздела вашего табличного представления. Представление будет заполнено повторяющимся узором, который выглядит как ячейки-заполнители с заданной высотой.

Создать подкласс UITableView. Дайте вашему подклассу UIView *_bottomView переменную экземпляра. Нам нужно переопределить layoutSubviews, поэтому мы будем лениво инициализировать _bottomView в этом методе.

@implementation MyTableView
{
    UIView *_bottomView;
}

Переопределить layoutSubviews. Первое, что вы делаете в своем layoutSubviews, это звоните [super layoutSubviews], поэтому вы продолжите вести себя как настоящий UITableView.

- (void)layoutSubviews
{
    [super layoutSubviews];

Следующее, что вы делаете, это ленивая инициализация _bottomView.

    if (!_bottomView) {

Вам нужен шаблон для заполнения _bottomView, и он должен выглядеть как заполнитель ячеек. Создайте контекст изображения шириной 1 пиксель и такого размера, какой вы хотите, чтобы была ячейка-заполнитель. Заполните контекст белым и нарисуйте разделительную линию (на самом деле пиксель) внизу. Получить изображение из контекста.

        UIGraphicsBeginImageContextWithOptions(CGSizeMake(1, placeholderHeight), YES, 0);
        [[UIColor whiteColor] setFill];
        UIRectFill(CGRectMake(0, 0, 1, placeholderHeight));
        [self.separatorColor setFill];
        UIRectFill(CGRectMake(0, placeholderHeight - 1, 1, 1));
        UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();

Затем создайте _bottomView, установите его цвет фона для этого изображения в качестве повторяющегося узора и добавьте его себе в качестве подпредставления.

        _bottomView = [[UIView alloc] initWithFrame:CGRectZero];
        _bottomView.opaque = YES;
        _bottomView.backgroundColor = [UIColor colorWithPatternImage:image];
        [self addSubview:_bottomView];
    } // end of if-block

Наконец, найдите прямоугольник вашего последнего раздела. Используйте этот прямоугольник, чтобы вычислить кадр для _bottomView, который начинается в нижней части последнего раздела, достаточно высокий (вдвое больше вашего собственного роста - более чем достаточно) и такой же ширины, как и прямоугольник последнего раздела.

    int lastSectionIndex = [self.dataSource numberOfSectionsInTableView:self] - 1;
    if (lastSectionIndex < 0)
        lastSectionIndex = 0;
    CGRect lastSectionRect = [self rectForSection:lastSectionIndex];
    CGRect bottomViewFrame = CGRectMake(lastSectionRect.origin.x, CGRectGetMaxY(lastSectionRect), lastSectionRect.size.width, self.bounds.size.height * 2);
    _bottomView.frame = bottomViewFrame;

Наконец, убедитесь, что _bottomView является вашим передним подпредставлением, поэтому оно заменит ячейки UITableView.

    [self bringSubviewToFront:_bottomView];
} // end of layoutSubviews

Конец.

@end
0 голосов
/ 06 декабря 2011

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

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

Так же, как вы сделали.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...