#iphone #ios #uitableview #pulse
#iPhone #iOS #uitableview #импульс
Вопрос:
Я создаю горизонтальное табличное представление, подобное программе чтения новостей 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
Комментарии:
1. вот еще одно руководство, в котором это подробно объясняется: raywenderlich.com/4723 /…
Ответ №1:
ах, хорошо, прочитав его еще раз, я понимаю, о чем вы спрашиваете ^^
- Установка рамки приводит к перерисовке представления. Это необходимо сделать, потому что в противном случае старая графика может мешать, и это выглядит некрасиво. Перерисовка также должна сделать линии рисования более четкими.
- вы устанавливаете рамку своей ячейки так, чтобы она располагалась где-то в другом месте (здесь 200,200), но совершенно нормально, что это не имеет никакого эффекта. Ячейка не может быть в другом месте, чем
CGPointZero
. Если вы хотите его сместить, вам нужно создать увеличенный вид и переместить содержимое. (представление может быть полупрозрачным, но это значительно замедлит прокрутку на старых устройствах) - вы спрашиваете, почему вам не нужно перерисовывать каждую ячейку, а только TableView. На самом деле я этого точно не знаю, но на самом деле это должно быть связано с изменением кадра представления таблицы. Обычно изменение кадра происходит путем поворота устройства так, чтобы ширина менялась. Теперь для разработчика было бы довольно глупо обновлять каждую ячейку для нового размера. Благодаря Apple TableView вызывает необходимый запрос на обновление для каждой ячейки, которая видна на экране. В конечном итоге для всех представлений вызываются одни и те же методы:
drawRect:
Комментарии:
1. Это имеет большой смысл в отношении ячейки, в которой должно быть
CGPointZero
. Это объясняет, почему вам не нужно сбрасывать исходное значение на 0,0 (оно делает это автоматически). Знаете ли вы, где я мог бы найти некоторую документацию по этому вопросу, чтобы убедиться, что я полностью понимаю концепции? Спасибо!2. На самом деле нет, только ссылка на класс UITableViewCell ( developer.apple.com/library/IOS/#documentation/UIKit/Reference /… ) и Руководство по программированию UITableView ( developer.apple.com/library/IOS/#documentation/UserExperience /… ). Создание пользовательской ячейки с помощью IB приводит к тому же, вы не можете установить происхождение этого IB-элемента
Ответ №2:
У меня проблемы с пониманием всех ваших проблем, но я сделаю все возможное.
При повороте устройства изменяется размер представления таблицы (рамки). Итак, вам нужно установить новый фрейм для табличного представления, чтобы создать новый «дизайн» (растягивая табличное представление на всю ширину). Это не относится к ячейкам, потому что они остаются того же размера даже после поворота.
пример:
________
|______| -> a cell width: 50 height: 200
после поворота:
___
| |
| | -> still the same size, width: 50 height: 200
|_|
a CGAffineTransform
— это только визуальный эффект. Это не влияет ни на размер, ни на положение его вложенных представлений. Итак, вам нужно выполнить прямо противоположное вращение для ваших ячеек, а затем для вашего табличного представления. В каком направлении оно неправильно повернуто? вверх ногами, влево, вправо или вы используете ребро для поворота, чтобы неправильно выбрать точку поворота?
Комментарии:
1. Спасибо за информацию. Я не поворачиваю устройство. У меня есть табличное представление с другим табличным представлением, встроенным в качестве подвида ячеек. Один вид таблицы перемещается вверх и вниз, другой — влево и вправо. iosstuff.wordpress.com/2011/06/29 /…