Изменение границ imageView UITableViewCell

Я пытаюсь разместить изображения разных размеров внутри imageView UITableViewCell. Я получаю данные изображения asynch'ly, создаю изображение, устанавливаю режим содержимого 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. Результат, который я получаю, всегда один и тот же. Все изображения имеют высоту 75 пикселей и различную ширину. Может ли кто-нибудь помочь мне решить эту проблему?

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

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

imageview: < UIImageView: 0x39ab8a0; frame = (0 0; 75 75); opaque = NO; userInteractionEnabled = НЕТ; layer = < CALayer: 0x39a92b0 → границы и contentMode: (null) (null)

Еще нет решения

Ответ 1

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

Решение заключается в изменении свойств, таких как bound, frame, contentMode in - (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;

}

Ответ 2

Таким образом, проблема с UITableViewCell заключается в том, что у вас нет контроля над размером встроенных объектов (а именно imageView, contentView, accessoriesView, 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 accessoryButtonTappedForRowWithIndexPath method
}

Ответ 3

"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];

Ответ 4

попробуйте изменить свойство contentMode изображения в "UIViewContentModeScaleAspectFit" или "UIViewContentModeScaleAspectFill"

Ответ 5

Создать подкласс 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