2009-08-13 7 views
1

У меня есть UITableView с пользовательскими фоновыми изображениями в каждой ячейке. Нижняя ячейка имеет более высокое изображение, которое остальное, потому что оно содержит тень. Это означает, что мне нужно увеличить высоту последней ячейки в секции, которая будет выше, чем обычно.Могу ли я остановить UITableViewCell от авторезистирования своих подзонов?

Когда я это делаю, содержимое UITableViewCell выглядит так, будто они отдыхают в нижней части ячейки, а не посередине (потому что визуальная ячейка короче, чем фактическая ячейка). Есть ли способ, по которому я могу разместить свой контент сверху, а не в центре, и не изменять размер его, когда ячейка становится нижней ячейкой (из-за удаления или чего-то еще)?

Установка маски авторезистора на этикетках, чтобы иметь статическую верхнюю границу, не работает, а также отключает autoresizesSubviews на ячейке.

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

Любые другие идеи, которые не связаны с хакерским методом?

ответ

5

У меня была аналогичная проблема (see this question).Решение заключалось в том, чтобы переопределить layoutSubviews в моем классе со списком пользовательских таблиц и ничего не делать.

+1

СПАСИБО! Наконец, настоящий ответ! –

+0

Вызов [super layoutSubviews] может вызвать эту проблему. «Ничего не делать» - это ключ! – shawnwall

+3

Привет всем, это разработчик iOS с 2014 года с iOS 7, и это дерьмо все еще происходит. Я не могу в это поверить. –

0

Нижняя ячейка в виде стола просто обрезана визуально, технически не изменяется, так как значение frame одинаково.

Я думаю, вы имеете в виду, что хотите, чтобы текст был вертикально выровнен с верхней частью ячейки, не так ли?

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

Откуда вы знаете, какой размер текста? Вы можете использовать метод handy-dandy sizeWithFont:... на NSString (технически это не в первоначальном определении класса, а added later by UIKit). Вот некоторые примеры кода:

NSString *myString = @"lorem ipsum dolor yadda"; 
UIFont *myFont = [UIFont fontWithName:@"Helvetica" size:14]; 
CGSize myStringSize = [myString sizeWithFont:myFont 
          constrainedToSize:textLabel.frame.size 
           lineBreakMode:textLabel.lineBreakMode]; 

textLabel.frame = CGRectMake(10, 10, /* Or whichever origin you want. */ 
          textLabel.frame.size.width, myStringSize.height); 
+0

Моя проблема заключается не в ее калибровке; это гарантирует, что он останется в таком размере. Ярлык является стандартным UITableViewCell.textLabel, и независимо от того, где я его размещаю, он, кажется, возвращается в свое местоположение в любое время, когда изменяется преобразование ячейки (т. Е. Включается/выключается режим редактирования). –

2

Попробуйте Tableview: heightForRowAtIndexPath: внутри вашего tableViewController. Не забудьте включить UITableViewDelegate в качестве протокола.

Отъезд Apple iPhone Reference Library: tableView:heightForRowAtIndexPath: за ограничения и то, что вы можете вернуть.

Edit: Хорошо, зная больше о вашем вопросе попробуйте

-(BOOL)tableView:(UITableView *)tableView shouldIndentWhileEditingRowAtIndexPath:(NSIndexPath *)indexPath{ 
return NO; 
} 
+0

Спасибо, но не спасибо. Я уже использую это, чтобы вернуть высоту строки (она должна быть BIGGER для нижней строки, потому что изображение больше). Если я возвращаю одинаковый размер для всех строк, нижняя строка выглядит слишком маленькой. –

+0

Вы можете выбрать строку, используя IndexPath, чтобы изменить размер последней строки только и изменить остальные размеры строк. Если if (indexPath.row == [количество массивов]) возвращает 100 else return 50; может решить вашу проблему с автоматическим изменением размера ячейки. –

+0

Нет, нет, нет. Я УЖЕ это делаю, потому что последняя строка должна быть больше, чем другие, но ВИЗУАЛЬНО она должна выглядеть одинаково (поэтому я использую растяжимое изображение). Проблема авторезистентности заключается не в том, что сама ячейка меняет высоту, но что она перемещает свои подзоны вокруг, например, при перемещении и выходе из режима редактирования. –

0

Я не нашел автоматическое решение для этого. Вместо этого я переопределил несколько функций (textLabel, detailTextLabel, setAccessoryView:), чтобы использовать мои собственные метки, которые авторезистируются, как я хочу, чтобы они были.

Мне также пришлось переопределить метод willTransitionToState: и вникать в особенности реализации, чтобы получить кнопки добавления/удаления и удаления подтверждения для перемещения туда, где я хочу их.

0

Это старый пост, но я столкнулся с ним, ища ту же проблему.

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

Я предполагаю, что несколько здесь добавили ярлыки к своим пользовательским ячейкам с использованием тех же имен. Это приводит к неправильному поведению, пока оно не будет прокручиваться, поскольку происходит конфликт имен. Вот где я нашел это. dequeued UITableViewCell has incorrect layout until scroll (using autolayout)

Повторное использование IBOutlets с разными названиями, чем стандартные ярлыки, исправлено для меня.

0

В моем случае у меня был UIImageView только в ячейке, и он изменил бы размер до полного размера ячейки независимо от того, что. Пробовал все решения, упомянутые здесь. Странно, что у меня есть еще одна более сложная ячейка, где у меня есть UIImageView + UIPageControl + UILabel + UIButton. Кажется, что это плохо, когда есть один UIImageView.

Моим обходным решением было поместить UIButton вместо изображения и иметь изображение в качестве фонового изображения кнопки.

Смежные вопросы