Изменение границ imageView UITableViewCell - PullRequest
10 голосов
/ 28 июня 2010

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

UIImage* image = [UIImage imageWithData:data];
[holder.imageView setContentMode:UIViewContentModeCenter || UIViewContentModeRedraw];
[holder.imageView setImage:image];
[holder.imageView setBounds:CGRectMake(0,0,75,75)];
[holder.imageView setFrame:CGRectMake(0,0,75,75)];
[holder setNeedsLayout]; 

Где держатель - UITableViewCell. Результат, который я получаю, всегда один и тот же. Все изображения имеют высоту 75px и разную ширину. Может кто-нибудь помочь мне решить эту проблему?

Я понял, что установка свойств contentMode и bounds не имеет никакого эффекта в этом коде. Я добавил NSLog после последней строки и получил следующие результаты:

NSLog(@"imageview:%@ bounds and contentMode:%@ %@",[holder imageView],[holder.imageView bounds],[holder.imageView contentMode]);

imageview: > границы и contentMode: (ноль) (ноль)

Все еще нет решения

Ответы [ 5 ]

42 голосов
/ 28 июня 2010

Готово, я наконец-то нашел решение, оно стоило мне 3 часа, хотя =)

Решение состоит в том, чтобы изменить свойства, такие как bound, frame, contentMode, в - (void) метод layoutSubviews пользовательского класса UITableViewCell. «Хитрость» заключается в написании кода макета в этом методе, в противном случае код не оказывает никакого влияния.

Ниже код сделал работу для меня. Строки таблицы выравниваются по вертикали.

- (void)layoutSubviews {
    [super layoutSubviews];
    self.imageView.bounds = CGRectMake(0,0,75,75);
    self.imageView.frame = CGRectMake(0,0,75,75);
    self.imageView.contentMode = UIViewContentModeScaleAspectFit;

    CGRect tmpFrame = self.textLabel.frame;
    tmpFrame.origin.x = 77;
    self.textLabel.frame = tmpFrame;

    tmpFrame = self.detailTextLabel.frame;
    tmpFrame.origin.x = 77;
    self.detailTextLabel.frame = tmpFrame;

}
11 голосов
/ 17 февраля 2012

Итак, проблема с UITableViewCell заключается в том, что вы не можете контролировать размер встроенных объектов (а именно imageView, contentView, accessoryView, backgroundView ).Когда таблица изменяется, ваши настройки растоптаны.

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

Альтернативный метод - добавить все вашего контента в contentView .Аналогичным образом, если вы настраиваете фон, вы можете создать прозрачный backgroundView и добавить свой собственный фоновый вид (например, myBackgroundView ) как подпредставление backgroundView .

Таким образом, вы можете размещать и изменять размеры ваших предметов так, как вам нужно.

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

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

// This code is not tested
// MyCustomTableViewCell
- (id) init{
    self = [super initWithStyle: UITableViewCellStyleDefault reuseIdentifier:@"MyReuseIdentifier"];
    if(self){
        //image view
        my_image_view = [[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"default_image.png"]] retain];
        [my_image_view setFrame:CGRectMake(10,10,30,30)];
        [self.contentView addSubview:my_image_view];

        //labels
        my_text_label = [[[UILabel alloc] initWithFrame:CGRectMake(50,10,100,15)] retain];
        [self.contentView addSubview:my_text_label];
        //set font, etc

        //detail label
        my_detail_label = [[[UILabel alloc] initWithFrame:CGRectMake(50,25,100,15)] retain];
        [self.contentView addSubview:my_detail_label];
        //set font, etc

        //accessory view
        //Whatever you want to do here
        //attach "accessoryButtonTapped" selector to button action

        //background view
        UIView* background_view = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, 200, 50)] autorelease];
        [background_view setBackgroundColor:[UIColor greenColor]];
        background_view.layer.cornerRadius = 17;
        background_view.layer.borderWidth = 3;
        background_view.layer.borderColor = [UIColor whiteColor].CGColor;

        [self setBackgroundView:[[[UIView alloc] init] autorelease]];
        [self.backgroundView addSubview:background_view];
    }

    return self;
}

- (void) setLabelText: (NSString*) label_text{
    [my_text_label setText:label_text];
}

- (void) setDetailText: (NSString*) detail_text{
    [my_detail_label setText: detail_text];
}

- (void) accessoryButtonTapped{
    //call table view delegate's accessoryButtonTappedForRowWithIndexPath method
}
2 голосов
/ 28 июня 2010

«UIViewContentModeCenter || UIViewContentModeRedraw» эквивалентно 1. Это также не битовое поле. Вы хотите UIViewContentModeCenter.

UITableViewCell.imageView управляется ячейкой. Если вам нужен пользовательский макет, попробуйте добавить представление в contentView (я предполагаю, что вы подразумеваете под «центрирован в области 75x75»):

UIImageView * iv = [[[UIImageView alloc] initWithImage:image] autorelease];
iv.frame = (CGRect){{0,0},{75,75}};
iv.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin| UIViewAutoresizingFlexibleRightMargin;
iv.contentMode = UIViewContentModeScaleAspectFit;
[holder.contentView addSubview:iv];
1 голос
/ 28 июня 2010

попробуйте изменить свойство «contentMode» для imageView на «UIViewContentModeScaleAspectFit» или «UIViewContentModeScaleAspectFill»

0 голосов
/ 11 мая 2017

Создать подкласс UITableViewCell:

@interface UITableViewCellSubClass : UITableViewCell

@end

@implementation UITableViewCellSubClass

- (void)layoutSubviews {
    [super layoutSubviews];
    self.imageView.frame = CGRectMake(0,4,32,32);
    self.textLabel.frame = CGRectMake(42,4,300,32);
}
@end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...