установка высоты на tableviewcell от размера uiimageview - PullRequest
0 голосов
/ 20 февраля 2011

У меня есть UITableView, заполненный пользовательскими ячейками. Я создал тип StripTableViewCell с UIImageVIew.

@interface StripTableViewCell : UITableViewCell {
    IBOutlet UIImageView *strip;
}

@property (nonatomic, retain) UIImageView *strip;

@end

StripTableViewCell инициализируется с новым UIImageView:

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {

    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        // Initialization code.
        strip = [[UIImageView alloc] init];
        [self.contentView addSubview:strip];
    }
    return self;
}

ContentMode для UIImageView установлен в UIViewContentModeScaleAspectFill; чтобы изображение соответствовало ширине ячейки.

- (void)layoutSubviews {
    [super layoutSubviews];
    strip.contentMode = UIViewContentModeScaleAspectFill;
    CGRect contentRect = self.contentView.bounds;
    CGRect frame;
    frame= CGRectMake(0, 0, contentRect.size.width, contentRect.size.height);

    strip.frame = frame;
}

Ячейка заполнена так:

(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"StripCell";

    StripTableViewCell *cell = (StripTableViewCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[StripTableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier] autorelease];
    }

    // Configure the cell...
    NSInteger row = [indexPath row];
    Strip *strip = [self.stripsArray objectAtIndex:row];
    UIImage *img = [[UIImage alloc] initWithData:strip.data];
    cell.strip.image = [img autorelease];

    return cell;
}

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

- (CGFloat) tableView: (UITableView *) tableView heightForRowAtIndexPath: (NSIndexPath *) indexPath
{
    StripTableViewCell *cell = (StripTableViewCell*)[self tableView:tableView cellForRowAtIndexPath:indexPath];

    UIImageView *picture = cell.strip;

    return picture.bounds.size.height; 
}

Мое приложение отображает только первое изображение и ячейку в неправильном размере. Так что я думаю, что мой подход здесь несколько неправильный. Не могли бы вы, ребята, помочь мне в правильном направлении?

PS: Не обращайте внимания на управление памятью в приведенных выше примерах, они вырезаны из контекста.

Ответы [ 2 ]

0 голосов
/ 20 февраля 2011

Я действительно нашел способ сделать это путем реализации heightForRowAtIndexPath. Но это выглядит некрасиво, но вот оно:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSInteger row = [indexPath row];
    Strip *strip = [self.stripsArray objectAtIndex:row];
    UIImage *img = [[[UIImage alloc] initWithData:strip.data] autorelease];
    CGImageRef image = img.CGImage;
    NSUInteger width = CGImageGetWidth(image);
    NSUInteger height = CGImageGetHeight(image);
    float factor = self.view.bounds.size.width/(float)width;
    return height*factor;   
}

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

Есть идеи получше?

0 голосов
/ 20 февраля 2011

Есть много вещей, которые могут пойти не так, как надо, и вы не включаете код, который показывает, как вы создаете и инициализируете UIImageView в своем подклассе UITableViewCell.Убедитесь, что вы правильно устанавливаете размер кадра «IBOutlet UIImageView * strip».Помните, что UIImageView представит изображение в соответствии с рамкой UIImageView и contentMode, а также размером изображения.Вы говорите, что устанавливаете contentMode ячейки, но вы устанавливаете contentMode UIImageView?Если вы хотите, чтобы изображение отображалось в полном размере в вашем UIImageView, вам необходимо изменить размер кадра UIImageView, чтобы он соответствовал границам UIImage, которые вы в него устанавливаете.

Редактировать: проблема, которую вы сами-ответ решает, что вы основываете высоту строки исходя из высоты изображения , а не высоты imageview .Установка изображения в просмотр изображений не меняет размер кадра просмотра изображений!После того, как вы вернули правильную высоту строки, она «перетекает» в высоту contentView, и она перетекает в высоту UIImageView в соответствии с вашим кодом.

Вы можете решить двойнуюсоздать просто путем кэширования UIImage в словаре и повторного использования его в cellForRowAtIndexPath.

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