Когда вам нужно сбросить свойство view.frame после трансформации iOS - PullRequest
2 голосов
/ 14 октября 2011

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

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

self.tableViewCell.horizontalTableView.transform = rotateTable;
self.tableViewCell.horizontalTableView.frame = CGRectMake(0, 0, self.tableViewCell.horizontalTableView.frame.size.width, self.tableViewCell.horizontalTableView.frame.size.height);

Больше контекста:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
TableViewCell *cell = (TableViewCell*)[self.tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    [[NSBundle mainBundle] loadNibNamed:@"TableViewCell" owner:self options:nil];

    CGAffineTransform rotateTable = CGAffineTransformMakeRotation(-M_PI_2);
    self.tableViewCell.horizontalTableView.transform = rotateTable;
    self.tableViewCell.horizontalTableView.frame = CGRectMake(0, 0, self.tableViewCell.horizontalTableView.frame.size.width, self.tableViewCell.horizontalTableView.frame.size.height);

    self.tableViewCell.contentArray = [self.arrays objectAtIndex:indexPath.section];

    self.tableViewCell.horizontalTableView.allowsSelection = YES;
    cell = self.tableViewCell;
    self.tableViewCell = nil;

}

cell.selectionStyle = UITableViewCellSelectionStyleNone;
return cell;

}

Но не переустанавливать кадр ячейки горизонтальной таблицы после преобразования (поворота) ячейки:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [self.horizontalTableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {

    [[NSBundle mainBundle] loadNibNamed:@"GameTableViewCell" owner:self options:nil];
    cell = self.gameTableCell;
    self.gameTableCell = nil;
}

CGAffineTransform rotateImage = CGAffineTransformMakeRotation(M_PI_2);
cell.transform = rotateImage;
return cell;

}

Я попытался сбросить кадр ячейки, и это не повлияло на вывод, даже если я поставил

cell.frame = CGMakeRect(200, 200, cell.frame.size.height, cell.frame.size.width)

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

Если я не сбрасываю кадр self.tableViewCell.horizontalTableView.frame, горизонтальный стол поворачивается, но в неправильном месте.

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

Спасибо!

// иллюстрация от iPortable
enter image description here

Ответы [ 2 ]

0 голосов
/ 18 октября 2011

аааа, хорошо после прочтения, я понимаю, что вы спрашиваете ^^

  1. Установка рамки приводит к перерисовке вида.Это должно быть сделано, потому что в противном случае старая графика может помешать, и это выглядит некрасиво.Перерисовка должна также обострить линии рисования.
  2. Вы устанавливаете рамку своей ячейки так, чтобы она была расположена где-то еще (здесь 200 200), но это совершенно нормально, что это не имеет никакого эффекта.Ячейка не может быть где-либо еще, кроме CGPointZero.Если вы хотите сместить его, вам нужно создать увеличенный вид и переместить содержимое.(представление может быть полупрозрачным, но это значительно замедлит прокрутку на старых устройствах)
  3. вы спрашиваете, почему вам не нужно перерисовывать каждую ячейку, а только tableView.На самом деле я точно не знаю, но это должно быть на самом деле из-за смены фрейма табличного представления.Обычно смена кадра происходит при вращении устройства так, что изменяется ширина.Теперь для разработчика было бы довольно глупо обновлять каждую ячейку для нового размера.Благодаря Apple tableView вызывает необходимый запрос на обновление для каждой ячейки, которая видна на экране.В конце концов для всех представлений вызываются одинаковые методы: drawRect:
0 голосов
/ 17 октября 2011

У меня проблемы с пониманием всех ваших проблем, но я сделаю все возможное.
При повороте устройства размер табличного представления изменяется (рамка). Таким образом, вы должны установить новый кадр для табличного представления, чтобы выполнить новый «дизайн» (растягивая табличное представление на всю ширину). Это не относится к ячейкам, потому что они остаются на одном и том же размере даже после поворота.
пример:

________
|______| -> a cell width: 50 height: 200

после вращения:

___
| |
| | -> still the same size, width: 50 height: 200
|_|

a CGAffineTransform - это только визуальный эффект. Это не влияет ни на размер, ни на положение его подпредставлений. Таким образом, вы должны сделать противоположное вращение для ваших ячеек, а затем для вашего представления таблицы. В каком направлении он вращается неправильно? вверх ногами, влево, вправо, или вы используете кромку для вращения, чтобы точка вращения была выбрана неправильно?

...