Пользовательский UITableView Динамическая высота ячейки - PullRequest
7 голосов
/ 29 сентября 2011

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

Мне нужно, чтобы ячейка росла в соответствии с текстом внутри, но никогда не опускалась ниже высоты 70.

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

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

Любая справка будетБольшое спасибо!

- (CGFloat) tableView: (UITableView *) tableView heightForRowAtIndexPath: (NSIndexPath   
*) indexPath
{

  CGSize aSize;
aSize = [[(Tweet*)[tweets objectAtIndex:indexPath.row]tweet] sizeWithFont:[UIFont 
systemFontOfSize:14]
            constrainedToSize:CGSizeMake(300.0, 1000.0)
                lineBreakMode:UILineBreakModeTailTruncation];

return  aSize.height;
}

Ответы [ 6 ]

18 голосов
/ 29 сентября 2011

Недавно у меня была похожая проблема, и это мне очень помогло.

#define PADDING 10.0f
- (CGFloat)tableView:(UITableView *)t heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSString *text = [self.items objectAtIndex:indexPath.row];
    CGSize textSize = [text sizeWithFont:[UIFont systemFontOfSize:14.0f] constrainedToSize:CGSizeMake(self.tableView.frame.size.width - PADDING * 3, 1000.0f)];

    return textSize.height + PADDING * 3;
}
3 голосов
/ 29 сентября 2011

Привет, поэтому вам нужно будет сохранить список строк в NSArray, а затем вам нужно будет вычислить высоту строки ns с помощью sizeWithFont: constrainedToSize: документация находится здесь http://developer.apple.com/library/ios/#documentation/UIKit/Reference/NSString_UIKit_Additions/Reference/Reference.html

поэтому ваш метод tableView должен выглядеть примерно так:

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSDictionary *stringAttributes = [NSDictionary dictionaryWithObject:[UIFont fontWithName:"Helvetica" size:9] forKey: NSFontAttributeName];

     CGSize cell_size = [string boundingRectWithSize:CGSizeMake(300,999) 
                            options:NSStringDrawingTruncatesLastVisibleLine|NSStringDrawingUsesLineFragmentOrigin     
                            attributes:stringAttributes context:nil].size;
if (cell_size.height > 70)
{
return cell_size.height;
}
else 
{
return 70;
}
}

РЕДАКТИРОВАТЬ: ЭТО было обновлено для iOS 7

0 голосов
/ 16 мая 2014

iOS 7

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout referenceSizeForHeaderInSection:(NSInteger)section
{
    NSString *text = @"Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello HelloHello HelloHello HelloHello HelloHello HelloHello Hello";

    CGRect rect = [text boundingRectWithSize:CGSizeMake(280.0f, CGFLOAT_MAX) options:NSStringDrawingTruncatesLastVisibleLine|NSStringDrawingUsesLineFragmentOrigin attributes:@{
        NSFontAttributeName: [UIFont fontWithName:@"Hellvetica" size:14.0f]
    } context:nil];

    return CGSizeMake(320.0f, ceil(rect.size.height) + 10.0f);
}
0 голосов
/ 13 мая 2014

Я перепробовал много решений, но одно из них сработало, предложенное другом:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {

    int height = [StringUtils findHeightForText:yourLabel havingWidth:yourWidth andFont:[UIFont systemFontOfSize:17.0f]];

    height += [StringUtils findHeightForText:yourOtherLabel havingWidth:yourWidth andFont:[UIFont systemFontOfSize:14.0f]];

    return height + CELL_SIZE_WITHOUT_LABELS; //important to know the size of your custom cell without the height of the variable labels
}

Класс StringUtils.h:

 #import <Foundation/Foundation.h>

    @interface StringUtils : NSObject

    + (CGFloat)findHeightForText:(NSString *)text havingWidth:(CGFloat)widthValue andFont:(UIFont *)font;

    @end

StringUtils.m класс:

    #import "StringUtils.h"

    @implementation StringUtils

    + (CGFloat)findHeightForText:(NSString *)text havingWidth:(CGFloat)widthValue andFont:(UIFont *)font {
        CGFloat result = font.pointSize+4;
        if (text) {
            CGSize size;

            CGRect frame = [text boundingRectWithSize:CGSizeMake(widthValue, CGFLOAT_MAX)
                                              options:NSStringDrawingUsesLineFragmentOrigin
                                           attributes:@{NSFontAttributeName:font}
                                              context:nil];
            size = CGSizeMake(frame.size.width, frame.size.height+1);
            result = MAX(size.height, result); //At least one row
        }
        return result;
    }

    @end

Это отлично сработало для меня. У меня была пользовательская ячейка с 3 изображениями с фиксированными размерами, 2 этикетками с фиксированными размерами и 2 переменными метками. Работал как шарм. Надеюсь, что это работает и для вас.

С наилучшими пожеланиями, Александр.

0 голосов
/ 21 февраля 2014

Я только что написал об этой проблеме и о том, как я наконец решил ее решить. Вы можете прочитать об этом здесь: Динамическая высота ячейки UITableView, основанная на содержании

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

Вы можете получить код здесь: https://github.com/danielsaidi/AutoSizeTableView

Надеюсь, это поможет!

(... и если нет, я бы хотел услышать, почему нет)

0 голосов
/ 29 сентября 2011

Используйте метод UITableViewDelegate:

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
 // here you need to get height of your textlabel in your custom cell. 
 MyCustomCell *myCell = (MyCustomCell *)[tableView cellForRowAtIndexPath:indexPath];
 return myCell.myTextLabel.frame.size.height + 20;
}

Как-то так

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...