2010-06-28 2 views
10

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

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 = NO; Слой = < CALayer: 0x39a92b0 >> оценки и contentMode: (нуль) (нуль)

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

ответ

42

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

решение изменить свойства, как связанного, рамка, contentMode в - (недействительными) 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; 

} 
+0

Bummer, я думал, что может быть вынужден создать еще один подкласс UITableViewCell ... спасибо, что поставил время, чтобы подтвердить его для меня! –

+1

Я должен согласиться с тем, что это огромная трата времени, чтобы заставить это работать так, как ожидалось. –

+0

Пока это работает, это все еще хак. Можно было бы ожидать, что кадр/границы будут разработаны из ограничений, установленных в пользовательском UITableViewCell. –

1

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

+1

Спасибо, я попробовал вашу рекомендацию, но это не сработало. Я понял, что любое значение, которое я установил для contentMode и границ, не имеет никакого эффекта. Я отредактировал свой первый пост, чтобы отразить это. –

2

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

Спасибо! Я решил проблему без использования содержимого. Я отвечу на вопрос как ответ через 2 дня =) –

10

Таким образом, проблема с UITableViewCell «s является то, что у вас есть без контроля над размером встроенных объектов (а именно 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's accessoryButtonTappedForRowWithIndexPath method 
} 
+0

Это на самом деле лучший метод, чем выбранный ответ. Вы также можете создать UITableViewCell через xib, если хотите. Вот учебник по этому вопросу: http://ijoshsmith.com/2011/07/16/creating-a-custom-uitableviewcell-in-ios-4/ –

+0

Это сделало трюк для меня. –

0

Создать подкласс 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 
Смежные вопросы