Определение размера пользовательского UITableViewCell и включенного UIImageView на основе размера изображения

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

В настоящее время я использую SDWebImage для асинхронной загрузки удаленных изображений. В данном случае это может быть не правильно. У меня также возникают проблемы с выяснением того, как дать пользовательской ячейке изображение при инициализации. URL-адрес изображения хранится в файле self.beerPhoto в DetailViewController.

Я искал это несколькими способами и не нашел именно то, что ищу. Самым близким было это: Как пропорционально масштабировать UIImageView, но этот метод кажется чтобы ячейка имела изображение при инициализации, поскольку я пытался заставить этот код работать, но установка изображения после инициализации оставила пустую ячейку.

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

Пожалуйста, дайте мне знать, если есть что-то еще, что вам нужно знать.

Заголовок для пользовательского UITableViewCell:

#import <UIKit/UIKit.h>


@interface BeerDetailHead : UITableViewCell {
    UILabel *beerName;
    UIImageView *beerImage;
}

@property(nonatomic, retain)UILabel *beerName;
@property(nonatomic, retain)UIImageView *beerImage;

@end

Соответствующая часть реализации пользовательского UITableViewCell

#import "BeerDetailHead.h"


@implementation BeerDetailHead

@synthesize beerName, beerImage;

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        // Initialization code
        //beerName = [[UILabel alloc]init];
        //beerName.textAlignment = UITextAlignmentLeft;
        //beerName.font = [UIFont systemFontOfSize:14];
        beerImage = [[UIImageView alloc]init];
        //[self.contentView addSubview:beerName];
        [self.contentView addSubview:beerImage];
    }
    return self;
}

- (void)layoutSubviews {
    [super layoutSubviews];
    CGRect contentRect = self.contentView.bounds;
    CGFloat boundsX = contentRect.origin.x;
    CGRect frame;
    frame= CGRectMake(boundsX+10 ,10, 280, 375);
    beerImage.frame = frame;
}

Ячейка DetailViewControllerForRowAtIndexPath

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *SimpleTableIdentifier = @"SimpleTableIdentifier";

    NSArray *listData =[self.tableContents objectForKey:
                        [self.sortedKeys objectAtIndex:[indexPath section]]];

    NSLog(@"listData = %@", listData);

    NSUInteger row = [indexPath row];

    if ([self.sortedKeys objectAtIndex:[indexPath section]] == @"header"){
        static NSString *headerTableIdentifier = @"HeaderTableIdentifier";
        BeerDetailHead * headerCell = (BeerDetailHead*)[tableView
                                                        dequeueReusableCellWithIdentifier: headerTableIdentifier];

        if(headerCell == nil) {

            headerCell = [[[BeerDetailHead alloc] initWithFrame:CGRectZero reuseIdentifier:headerTableIdentifier] autorelease];                 
        }

        headerCell.beerName.text = [listData objectAtIndex:row];
        [headerCell.beerImage setImageWithURL:[NSURL URLWithString:self.beerPhoto]
                       placeholderImage:[UIImage imageNamed:@"placeholder.png"]];
        //NSLog(@"frame = %@", headerCell.beerImage.frame);

        return headerCell;
    }
    else{
        //use standard UITableViewCell
    }
}

person scottoliver    schedule 07.09.2011    source источник


Ответы (1)


Реализуйте метод делегата tableView:heightForRowAtIndexPath: и возвращайте рассчитанную высоту для каждой строки из этого метода.
После загрузки каждого изображения вызовите reloadData в tableView ИЛИ, если вы хотите анимировать изменения, вызовите:

[self.tableView beginUpdates];
[self.tableView endUpdates];

Кроме того, вы можете объединить несколько обновлений высоты последовательности в одно. Я бы использовал небольшую задержку, чтобы выполнить это:

// triggerUpdates calls the above code
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(triggerUpdates) object:nil];
[self performSelector:@selector(triggerUpdates) withObject:nil afterDelay:0.1];
person Evgeny Shurakov    schedule 07.09.2011
comment
У меня было tableView:heightForRowAtIndexPath, реализованное с константой; забыл указать здесь. На данный момент пользовательский UITableViewCell вычисляет правильную высоту кадра UIImageView, используя ширину изображения, высоту и постоянную ширину с измененным размером 280. Вызов reloadData в viewDidAppear дает правильное изображение. Однако heightForRowAtIndexPath вычисляется до того, как изображение имеет правильную высоту. Все еще разрабатываю правильное решение для высоты. - person scottoliver; 08.09.2011
comment
Просто интересно, почему вы немного задержались? Есть какая-то особая причина? - person fatih; 20.07.2012