UITableViewCell: как дать встроенному изображению поле на экране сетчатки - PullRequest
4 голосов
/ 05 февраля 2011

Я хотел бы применить поле к UIImageView слева от простого старого UITableViewCell (сгруппированный стиль).

Я нашел единственный способ сделать это (через здесь ) - изменить размер самого UIImage, прежде чем присоединять его к UIImageView.Если изображение меньше ячейки, оно будет центрировано;оставляя желаемое поле как побочный эффект.

Хорошо, это работает, но теперь мое изображение размыто, потому что высота строки 100 единица не равна 100 пикселей вкл.iPhone4, его 200. Таким образом, я получаю UIImage, масштабированный до 90x90 пикселей , который создает изображение UIImageView размером 90x90 (180x180 пикселей).Введите уродливое размытие.

Итак, мой вопрос: как мне добиться наложения на imageView без чрезмерной дискретизации моего изображения?(в идеале вообще без понижающей дискретизации - мне все равно нужно сохранить оригинал на потом).

Мне кажется, что я упускаю что-то очевидное;Я действительно не хочу реализовывать пользовательский класс ячеек только для этого.

Ответы [ 4 ]

3 голосов
/ 06 февраля 2011

Спасибо, ребята, я придумала «решение», которое не требует подклассов.

Я по-прежнему уменьшаю изображение до размера 2x (180x180 из примера ввопрос).Затем, когда я приду, чтобы создать окончательный UIImage из обработанного CGImage, я использую:

<em>UIImage:</em> +(UIImage *)imageWithCGImage:(CGImageRef)imageRef scale:(CGFloat)scale orientation:(UIImageOrientation)orientation

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

2 голосов
/ 13 января 2013

Реализуйте этот метод в своем подклассе UITableViewCell

-(void) layoutSubviews
{
    [super layoutSubviews];
    self.imageView.frame = CGRectInset(self.imageView.frame, 5, 5);
}
0 голосов
/ 06 февраля 2011

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

1: в подкласс я добавил свойство mainImageView, которое можно использовать вместо imageView.

@property (nonatomic, retain) UIImageView *mainImageView;

2: затем в - (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier. Я выделил и инициализировал mainImageView. Вы можете установить любой кадр (прямоугольник) для mainImageView. Добавьте его как подпредставление к contentView. Я использовал insetImageView, чтобы выровнять его по вертикали `contentView '.

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];

    if (self) {
        // Initialization code.     
        mainImageView = [[UIImageView alloc] initWithFrame:frameCellMainImageView];
        [self.contentView addSubview:mainImageView];

                insetImageView = (sizeRowHeightTwoLinedDetail - frameCellMainImageView.size.height) / 2.0;

    }

    return self;
}

3: переопределить - (void)layoutSubviews, чтобы другие свойства, такие как textLabel, detailTextLabel, устанавливали свои кадры в хорошем положении с добавленным свойством mainImageView

- (void)layoutSubviews {
    [super layoutSubviews];

    CGRect frameImageView = frameCellMainImageView;
    frameImageView.origin.x = insetImageView;
    frameImageView.origin.y = insetImageView;

    [self.mainImageView setFrame:frameImageView];

    // Use changed frame
    frameImageView = self.mainImageView.frame;
    CGFloat newLeftInset = frameImageView.size.width + insetImageView;

    CGRect frameTextLabel = self.textLabel.frame;
    CGRect frameDetailLabel = self.detailTextLabel.frame;

    frameTextLabel.origin.x += newLeftInset;
    frameDetailLabel.origin.x += newLeftInset;

    CGFloat newTextWidth = 320.0;
    newTextWidth -= newLeftInset;
    newTextWidth -= insetImageView;
    newTextWidth -= insetImageView;

    frameTextLabel.size.width = newTextWidth;
    frameDetailLabel.size.width = newTextWidth;

    [self.textLabel setFrame:frameTextLabel];
    [self.detailTextLabel setFrame:frameDetailLabel];
}

4: при использовании этой ячейки в методах UITableDataSourceDelegate используйте cell.mainImageView для получения сообщений вместо обычных cell.imageView

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

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

Вы пытались просто настроить рамку просмотра изображения? Попробуйте это:

UITableViewCell * tableViewCell = [[[UITableViewCell alloc] init] autorelease];
tableViewCell.imageView.image = [UIImage imageNamed:@"table-view-image"];

CGRect imageViewFrame = tableViewCell.imageView.frame;
imageViewFrame.origin.x += 10.0f;
tableViewCell.imageView.frame = imageViewFrame;

Это просто увеличит изображение на 10 пунктов больше, чем его нормальная x координата. Если вы хотите заполнить обе стороны, вы также можете установить для свойства contentMode в представлении изображения значение UIViewContentModeCenter и настроить его ширину:

UITableViewCell * tableViewCell = [[[UITableViewCell alloc] init] autorelease];
tableViewCell.imageView.image = [UIImage imageNamed:@"table-view-image"];
tableViewCell.imageView.contentMode = UIViewContentModeCenter;

CGRect imageViewFrame = tableViewCell.imageView.frame;
imageViewFrame.size.width += 20.0f;
tableViewCell.imageView.frame = imageViewFrame;

Это позволит увеличить изображение на 20 пунктов, но поскольку режим содержимого установлен по центру, изображение будет отображаться без растяжения. Если размеры вашего изображения правильные, это эффективно увеличит изображение на 10 точек слева и справа. Тем не менее, вы должны знать, что если вы сделаете это, то UIImage, который вы предоставите, должен уже быть точными размерами, чтобы соответствовать изображению. По умолчанию для contentMode установлено значение UIViewContentModeScaleToFill, поэтому оно автоматически масштабирует изображения, чтобы заполнить кадр просмотра изображения. Установка UIViewContentModeCenter больше не будет делать этого, но будет центрировать фактическое изображение.

...