#ios #objective-c #iphone #uitableview
#iOS #objective-c #iPhone #uitableview
Вопрос:
Я пытаюсь изменить размер своего UITableViewCell's
фрейма с помощью:
[cell setFrame:CGRectMake(cell.frame.origin.x,
cell.frame.origin.y,
cell.frame.size.width,
cell.frame.size.height 25)];
однако после того, как я это сделаю, размер не изменяется… почему это?
Это странно, как будто я добавляю UIToolBar
в ячейку, она изменяет размер, но когда я добавляю UIView, это не так:
[cell.contentView addSubview:sideSwipeView];
Комментарии:
1. Привет, ахерламбанг… Помогли ли ответы? Пожалуйста, выберите правильный ответ… Если нет, пожалуйста, прокомментируйте, чтобы сообщить нам, почему это не помогло. 🙂
Ответ №1:
Вот вкратце об этом:
- Ширина вашей ячейки определяется шириной таблицы, в которой она находится.
[РЕДАКТИРОВАТЬ: если это сгруппированное табличное представление, ячейка на 20-60 пикселей уже ширины tableview, в зависимости от того, используете ли вы iPhone или iPad.]
- Высота вашей ячейки определяется
heightForRowAtIndexPath
методом.
Если вы вручную устанавливаете фрейм ячейки, это будет бесполезно, за исключением случаев, когда вы используете подкласс ячейки, в который вы хотите добавить вложенные представления на основе размеров ячейки.
Даже в этом случае рекомендуется получить фрейм ячейки из tableview с помощью rectForRowAtIndexPath:(NSIndexPath*)indexPath
метода, а затем установить этот фрейм в качестве фрейма ячейки (после установки исходного значения Y фрейма равным 0).
Я не совсем уверен насчет UIToolbar, но фрейм вашего подвида не изменится при изменении фрейма ячейки.
Может быть, если бы вы могли рассказать нам, чего вы пытаетесь достичь, мы могли бы предложить решение для вас?
———————РЕДАКТИРОВАТЬ———————
Итак, вам нужно динамически добавлять вложенный просмотр в ячейку при нажатии на нее и изменять его высоту в соответствии с новым вложенным представлением. Это будет сложно, так что вот:
В вашем файле .h объявите:
BOOL subviewAdded;
В вашем файле .m при инициализации выполните:
subviewAdded = NO;
Давайте предположим, что вы хотите, чтобы высота ячейки составляла 50 без подвида и 100 с подвидом. Соответственно, ваш метод heightForRow должен быть:
- (CGFloat)tableView:(UITableView *)tableView
heightForRowAtIndexPath:(NSIndexPath *)indexPath {
return (subviewAdded?100.0f:50.0f);
}
Это означает, что изначально, поскольку subviewAdded равно NO, все ваши ячейки будут иметь меньшую высоту.
Теперь, чтобы добавить вложенный просмотр в ячейку при нажатии на нее и динамически изменять ее высоту, сделайте это в вашем методе didSelectRow:
- (void)tableView:(UITableView *)tableView
didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
//Get the cell at this indexPath
UITableViewCell *thisCell = [tableView cellForRowAtIndexPath:indexPath];
if(subviewAdded)
{
subviewAdded = NO;
for(int i = 0; i < [thisCell.contentView.subviews count]; i )
{
UIView *thisSubview = [thisCell.contentView.subviews objectAtIndex:i];
[thisSubview removeFromSuperview];
}
}
else
{
UIView *someView = [[UIView alloc] initWithFrame:someFrame];
[thisCell.contentView addSubview:someView];
[someView release];
subviewAdded = YES;
}
NSMutableArray *array = [NSMutableArray array];
[array addObject:indexPath];
[tableView reloadRowsAtIndexPaths:array
withRowAnimation:UITableViewRowAnimationFade];
}
Итак, что здесь произойдет, так это то, что вы добавляете вложенный просмотр в эту ячейку, к которой вы подключились. Перезагрузка этой ячейки вызовет heightForRowAtIndexPath
приятную анимацию затухания и изменит высоту вашего tableview.
ВАЖНО: В идеале вы должны поддерживать массив NSNumbers с логическими значениями. Размер массива должен быть того же размера, что и количество имеющихся у вас ячеек tableview.
Затем в heightForRow вы бы проверили этот массив вместо использования одного логического значения для всего TableView. Это гарантировало бы, что у вас могут быть разные высоты для разных ячеек.
Это выглядело бы примерно так:
- (CGFloat)tableView:(UITableView *)tableView
heightForRowAtIndexPath:(NSIndexPath *)indexPath {
BOOL thisBool = (BOOL)[[booleanArray objectAtIndex:indexPath.row] boolValue];
return (thisBool?100.0f:50.0f);
}
Я не публиковал здесь весь этот код, поскольку это подразумевается, и то, что я опубликовал, должно помочь вам разобраться с логическим массивом.
В любом случае, вот вы где. Я только что сам протестировал этот код, так что он работает 🙂
Комментарии:
1. Я пытаюсь создать thenextweb.com/apps/files/2011/04/iPhone-Screenshot-11.jpeg , где, если вы нажмете на ячейку один раз, она добавит вложенный вид в ячейку, а затем снова нажмете на нее, это удалит вложенный вид .. все динамически настраивают высоту вида
Ответ №2:
Если вы хотите увеличить высоту своей ячейки на основе какого-либо параметра, например, текста, изображения, вы должны реализовать heightForRowAtIndexPath
метод UITableViewDelegate
в своем коде.
- (CGFloat)tableView:(UITableView *)tableView
heightForRowAtIndexPath:(NSIndexPath *)indexPath
Комментарии:
1. 1 Таблица не запрашивает у ячейки ее размеры при их размещении. К лучшему это или к худшему, но это просто не так, как это работает.
2. Я очень хорошо осведомлен об этом, однако теперь проблема в том, что когда я проверяю внутри heightForRowAtIndexPath, существует ли этот subviews или нет, поэтому я могу отрегулировать высоту, она выходит из строя. Я только что добавил этот код, если ([cell.contentView viewWithTag: 5] != nil) optionsHeight = 25; .
3. heightForRow вызывается ПЕРЕД cellForRow …. отсюда сбой. Ваша ячейка еще не «существует». В heightForRow вы указываете tableview отобразить ячейку на определенную высоту. На данный момент ячейка не отрисована, поэтому вы не можете получить к ней доступ.
4. @aherlambang: Высота ячейки рассчитывается по ее содержимому (текст, изображения, другие виды). и вы могли бы получить к ним доступ (текст, изображения, другие виды) в heightForRowAtIndexPath и вычислить точную высоту.
5. @ Siddharth Iyer: Без обид, друг, я сделал комментарий к вашему ответу, а не к вашему комментарию к моему ответу, поскольку я читаю, что ваш ответ правильный.