Проблемы с высотой UITableViewCell с UILabel и произвольной длины текста - PullRequest
0 голосов
/ 23 августа 2011

В настоящее время я пытаюсь получить UITableView для использования пользовательских высот ячеек на основе текста в массиве. Проблема, которую я вижу, заключается в том, что текст, кажется, сжимается вместе в точке, а не заполняет всю длину пользовательской ячейки. Это приводит к тому, что текст перекрывается над ячейками, иногда исчезая под ними.

Вот код, который у меня есть для определения высоты ячейки, я не уверен в стандартной высоте текста UILabel, но, похоже, это хорошо работает при высоте I для шрифта.

if (indexPath.section == 0) {

    NSString *text = [[self.recipeDict objectForKey:@"Ingredients"] objectAtIndex:[indexPath row]];

    CGSize constraint = CGSizeMake(320 - (10 * 2), 20000.0f);

    CGSize size = [text sizeWithFont:[UIFont systemFontOfSize:12] constrainedToSize:constraint lineBreakMode:UILineBreakModeWordWrap];

    CGFloat height = size.height;

    return height + 20;
}

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

UITableViewCell *cell;
UITableViewCell *ingredientCell;
UITableViewCell *methodCell;

if (indexPath.section == 0) {
    UILabel *ingredientText;

    static NSString *ingredientCellIdentifier = @"Ingredient Cell";

    ingredientCell = [tableView dequeueReusableCellWithIdentifier: ingredientCellIdentifier];

    if (ingredientCell == nil)
    {
        ingredientCell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier: ingredientCellIdentifier] autorelease];

        ingredientText = [[UILabel alloc] initWithFrame:CGRectMake(15, 7, 290, 44)];
        [ingredientText setLineBreakMode:UILineBreakModeWordWrap];
        [ingredientText setNumberOfLines:0];
        [ingredientCell.contentView addSubview:ingredientText];

        ingredientText.tag = 1;

        [ingredientText release];

        ingredientCell.contentMode = UIViewContentModeRedraw;
    }

    ingredientText = (UILabel*)[ingredientCell viewWithTag:1];
    ingredientText.text = [[self.recipeDict objectForKey:@"Ingredients"] objectAtIndex: indexPath.row];
    [ingredientText sizeToFit];

    return ingredientCell;
}

Это моя вторая попытка решить эту проблему, но, похоже, она выходит за рамки моих нынешних способностей, поэтому я приветствую мудрость, приобретенную благодаря опыту.

ОБНОВЛЕНИЕ -

После дальнейшего исследования кажется, что проблема заключается в изменении размера UTabel componentText.

Он начинается с высоты, необходимой для отображаемого текста, однако, когда эта метка перерисовывается с большей высотой для другого фрагмента текста, который требует больше строк, он никогда не сокращается снова. Кажется, что метод sizeToFit устанавливает приоритеты, используя доступную высоту, а не беря ширину и уменьшая высоту.

Сейчас я снова установил ширину после sizeToFit, который работает вокруг проблемы, но приводит к нечетному интервалу в зависимости от высоты метки.

Ответы [ 2 ]

0 голосов
/ 31 августа 2011

Решением этой проблемы было то, что ширина, указанная в константе в методе высоты ячейки, не совпадала с рамкой для текста ячейки, указанного позже в методе cellForRowAtIndexPath.

Как только они совпадают,проблема решается сама собой.

Другой постоянный размер приводил к тому, что сообщалось о непоследовательных и неточных высотах UILabel.Это привело к неправильной установке высоты строки таблицы.

0 голосов
/ 23 августа 2011

Пара вещей:

  • Вы не установили шрифт для UILabel, что означает, что вы изменяете размер до неизвестной высоты
  • Вам необходимо установить маску автоматического изменения размера UILabel, чтобы она изменялась при изменении высоты ячейки

Вот рабочий код (проверено):

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    if (indexPath.section == 0) {

        NSString *text = [_items objectAtIndex:[indexPath row]];

        CGSize constraint = CGSizeMake(320 - (10 * 2), 20000.0f);

        CGSize size = [text sizeWithFont:[UIFont systemFontOfSize:12] constrainedToSize:constraint lineBreakMode:UILineBreakModeWordWrap];

        CGFloat height = size.height;

        return height + 20;
    }

    return tableView.rowHeight;
}

#pragma mark - UITableViewDatasource

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell;
    UITableViewCell *ingredientCell = nil;
    UITableViewCell *methodCell;

    if (indexPath.section == 0) {
        UILabel *ingredientText;

        static NSString *ingredientCellIdentifier = @"Ingredient Cell";

        ingredientCell = [tableView dequeueReusableCellWithIdentifier: ingredientCellIdentifier];

        if (ingredientCell == nil)
        {
            ingredientCell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier: ingredientCellIdentifier] autorelease];

            ingredientText = [[UILabel alloc] initWithFrame:ingredientCell.bounds];
            ingredientText.font = [UIFont systemFontOfSize:12.0f];
            ingredientText.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
            [ingredientText setLineBreakMode:UILineBreakModeWordWrap];
            [ingredientText setNumberOfLines:0];
            [ingredientCell.contentView addSubview:ingredientText];

            ingredientText.tag = 1;

            [ingredientText release];

            ingredientCell.contentMode = UIViewContentModeRedraw;
        }

        ingredientText = (UILabel*)[ingredientCell viewWithTag:1];
        ingredientText.text = [_items objectAtIndex: indexPath.row];

        return ingredientCell; 
    }

}
  • Убедитесь, что вы всегда возвращаете значения для tableView: cellForRowAtIndexPath: и tableView: heightForRowAtIndexPath: методов
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...