LayoutSubviews в UIViewTableCell не работает

У меня есть класс PostListTableCell, наследующий UITableViewCell, который используется как моя пользовательская ячейка в UITableView.

Мне нужно изменить размер ярлыков в ячейке, поэтому я назвал следующий метод в

- (void)layoutSubviews {
    [super layoutSubviews];
    [_titleLabel sizeToFit];
}

Но проблема в том, что когда UITableView загружен, _titleLabel не изменяет размер:

enter image description here

Но после того, как я щелкнул эту ячейку и выделил ее, название изменило размер:

enter image description here

Ниже приведен код для загрузки данных:

- (PostListTableCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *PostListTableCellIdentifier = @"PostListTableCell";
    PostListTableCell *cell = (PostListTableCell*) [tableView dequeueReusableCellWithIdentifier:PostListTableCellIdentifier];

    if (cell == nil) {
        cell = [[PostListTableCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:PostListTableCellIdentifier];
    }

   Post *post = (Post*)_posts[indexPath.row];
    [cell loadPost:post];

    return cell;
}

Может ли кто-нибудь помочь?

Ответ 1

Проблема заключается в автозапуске, который снова изменит размер метки для вас с ограничениями, которые вы установили, когда вы создаете метку в Interface Build, к сожалению, в autolayout иерархия - это Constraints > Frame

Ответ 2

Прежде всего, если вы используете метод Autolayout в (viewDidLoad), который связан с UIViewController и его подклассами и ( awakeFromNib), которые связан с UIView и UITableViewCell и т.д. все представления Frames еще не были отображены, в то время как эти методы называются.

Итак, если вы хотите изменить размер любого из выходов, вы должны называть его (ViewDidAppear) для UIViewController. В UIViews и ячейках вы должны использовать:

- (void)layoutSubViews
{
     [super layoutSubviews];
}

И не забудьте установить интервал в свой метод изменения размера, как в этом ответе.

Ответ 3

установить фрейм для вашей метки

-(void)layoutSubviews
{
    CGRect frame = CGRectMake(20, 30, 200, 50);
   _titleLabel.frame = frame;
}