Позиция UILabel в UITableViewCell не выполняется с первой попытки - PullRequest
0 голосов
/ 04 декабря 2011

Я просто начинаю понимать, что такое iOS, поэтому я надеюсь, что получаю правильный уровень детализации здесь ...

У меня есть UILabel, загруженный в ячейку таблицы, созданную с помощью .xib. На самом деле несколько этикеток, одна из которых имеет разную длину (и, следовательно, разную высоту). heightForRowAtIndexPath и т. Д. Должным образом переопределены, и необходимая высота для обеих меток рассчитывается правильно и присваивается каждой из .frame

После того, как были установлены оба размера, я установил frame.origin.y для метки меньшего размера (фиксированная длина, всегда на одну строку), чтобы он соответствовал метке большего размера. Это работает настолько, насколько можно видеть, шагая через cellForRowAtIndexPath, но при первоначальном отображении вновь созданной ячейки, источник кажется не совсем вертикально центрированным в контейнере, в отличие от застрявшей вершины.

После нажатия кнопки «через» ячейку в другом представлении и возврата к (теперь повторно используемому и, по-видимому, уже правильному размеру) контейнеру задается, как и раньше, и он появляется там, где я ожидал.

Это кажется , как будто размер контейнера изменяется после возврата cellForRowAtIndexPath, и что где-то там находится новая позиция для нашей метки; это объясняет, почему повторное использование ячейки позже решает проблему.

Я испробовал каждую, по-видимому, вменяемую комбинацию внутренних и внешних настроек режима и базовой линии, настроек растяжения и т. Д. В недоумении для объяснений и / или обходных путей.

Обновление:

Предложение по Изменение позиции пользовательского UIButton в пользовательском вопросе UITableViewCell решило проблему. Решение состояло в том, чтобы создать подкласс UITableViewCell и переопределить layoutSubviews, тем самым получая возможность переместить подэлементы после того, как TableView выполнил свое обычное позиционирование. Закроет это, как только этот человек ответит здесь, или щедрость истечет, и я сам отвечу, с кодом.

Ответы [ 2 ]

6 голосов
/ 09 декабря 2011

Если я делаю какой-либо сложный макет в UITableViewCell, я стараюсь не допустить его в cellForRowAtIndexPath. Один из вариантов - сделать макет в - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath, но я предпочитаю инкапсулировать макет в пользовательский класс UITableViewCell.

Создайте свой собственный подкласс UITableViewCell. Создайте и добавьте пользовательскую кнопку / метку / представление в contentView ячейки в вашем методе init или создайте и добавьте ее лениво через свойство accessor. Переопределите layoutSubviews и поставьте кнопку по желанию.

Примерно так:

@implementation MyCustomCell

- (void) init
{
    self = [super initWithStyle: UITableViewCellStyleDefault reuseIdentifier: nil];
    if ( self != nil )  
    {
         _myButton = [[UIButton buttonWithType: UIButtonTypeRoundedRect] retain];
         [self.contentView addSubview: _myButton];
    }

    return self;
}

- (void) layoutSubviews
{
    [super layoutSubviews];

    // dynamic layout logic:
    if ( ... )
    {

         _myButton.frame = CGRectMake( 10, 10, 100, 30 );
    }
    else 
   {
         _myButton.frame = CGRectMake( 20, 10, 50, 30 );

   }
}
0 голосов
/ 27 января 2016

Я также столкнулся с подобной проблемой.

Размещение кода в этом методе сработало для меня.

-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
// here.
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...