Смещенные ячейки табличного представления в повернутом UITableView - PullRequest
0 голосов
/ 14 февраля 2012

В качестве небольшого фона я создаю повернутый UITableView в качестве своего рода бокового вида «сборщика».Чтобы сделать это, я беру UITableView, применяю к нему преобразование вращения, а затем снова поворачиваю UITableViewCells внутри табличного представления.

Проблема, с которой я сталкиваюсь, заключается в том, что некоторые ячейки таблицы становятся "не выровненными" - их рамка отрисовывается с определенным удаленным смещением (как в измерении x, так и в направлении y) от других ячеек таблицы.

Я сузил, что эта ошибка возникает в первой ячейке таблицы за пределами видимого прямоугольника табличного представления после вызова [tableView reloadData].(то есть, если у меня есть 4 ячейки таблицы, A, который полностью виден и прорисован, B, который наполовину включен / наполовину закрыт от вида, и C и D, которые полностью не видны на экране и еще не отрисованы, при прокрутке до C этопрослушивается, но когда я прокручиваю до D, это не так).

Теперь для некоторого кода -

Инициирование содержащего представления

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        ...
        self.tableView = [[UITableView alloc] init];
        [self addSubview:_tableView];
        [_tableView setDelegate:self];
        [_tableView setShowsVerticalScrollIndicator:NO];
        [_tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone];
        CGAffineTransform transform = CGAffineTransformMakeRotation(-1.5707963);    
        _tableView.transform = transform;
        _tableView.frame = self.bounds;
        ...
    }
    return self;
}

соответствующие методы делегата

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{
    return [tableView.dataSource tableView:tableView cellForRowAtIndexPath:indexPath].frame.size.height;
}

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{ 
    CGAffineTransform transform = CGAffineTransformMakeRotation(1.5707963);
    cell.transform = transform;
}

макет ячейки таблицы Subviews
edit: Я вручную устанавливаю размер ячейки (в основном ширину), основываясь на длине содержимого ячейки

- (void)layoutSubviews {
    [super layoutSubviews];

    // some calculations and sizing of subviews

    // height and width are swapped here, because the table cell will be rotated.
    self.frame = (CGRect){self.frame.origin.x,self.frame.origin.y,calculatedHeight,calculatedWidth};
}

Казалось бы, ошибочная табличная ячейка frame.origin установлена ​​неправильно, когда она достигает подпредставлений макета.Установка значения origin.x для фрейма в 0 устраняет проблему смещения размера x, но, очевидно, я не могу сделать то же самое для измерения y, потому что это значение определяет положение ячейки в виде таблицы.

Пожалуйста, дайте мне знать, если есть какая-то важная информация, которую я мог бы опустить.Спасибо!

Ответы [ 3 ]

0 голосов
/ 14 февраля 2012

Хорошие новости - потратив много часов, пытаясь понять это, я просто наткнулся на решение.

Этот код вызывался несколько раз для ячейки с ошибками, и, очевидно, из-за некоторых сложностей CALayer и CGAffineTranform, присвоение transform оказало аддитивное влияние.

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{ 
    CGAffineTransform transform = CGAffineTransformMakeRotation(1.5707963);
    cell.transform = transform;
}

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

// ... init stuff  
self.transform = CGAffineTranformMakeRotation(1.5707963);
// ... more init stuff
0 голосов
/ 04 апреля 2017

Создайте подкласс UITableViewCell и переопределите его layoutSubviews, убедитесь, что преобразование установлено там:

class InvertedTableViewCell: UITableViewCell {
    override func layoutSubviews() {
            self.transform = CGAffineTranformMakeRotation(1.5707963)
        }
}
0 голосов
/ 14 февраля 2012

Вы пытались установить точку привязки слоя клеток, которая является точкой, вокруг которой слой вращается (трансформируется). По умолчанию он равен .5, .5, который является центром слоя, возможно, его нужно установить на 0, 0 (или 1, 1 - я не могу вспомнить, инвертированы ли координаты слоя с макушки головы)

или попробуйте установить рамку в willDisplayCell сразу после применения преобразования, а не делать это в подпредставлениях макета

...