2010-06-28 12 views
10

Estoy tratando de colocar varias imágenes de tamaño dentro de imageView de UITableViewCell. Obtengo los datos de la imagen de manera asincrónica, creo la imagen, establezco el modo de contenido de imageView y finalmente establezco los límites de imageView. Pero el código parece insensible a cualquier cambio que realice. Quiero que las imágenes se centren en un área de 75x75. Escribí el código de abajo para este finCambiar los límites de imageView de 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]; 

Dónde titular es el UITableViewCell. El resultado que obtengo es siempre el mismo. Todas las imágenes tienen 75px de altura y diferentes anchuras. ¿Alguien puede ayudarme a resolver este problema?

Me he dado cuenta de que establecer las propiedades de contentMode y bounds no tiene ningún efecto en ese código. He añadido un NSLog después de la última línea y conseguido los resultados que aparecen a continuación:

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

imageview: < UIImageView: 0x39ab8a0; frame = (0 0; 75 75); opaco = NO; userInteractionEnabled = NO; capa = < CALayer: 0x39a92b0 >> límites y contentMode: (null) (null)

Aún ninguna solución

Respuesta

42

Done, finalmente encontré la solución, me costó 3 horas aunque =)

la solución es cambiar propiedades como límite, marco, contentMode en - (void) me layoutSubviews thod de la clase UITableViewCell personalizada. El "truco" es escribir código de diseño en este método, de lo contrario, el código no tiene ningún efecto.

Debajo del código hizo el trabajo por mí. Hace que las filas de la tabla estén alineadas verticalmente.

- (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, pensé que podría forzarme a crear otra subclase UITableViewCell ... ¡gracias por dedicarme el tiempo para confirmarlo! –

+1

Tengo que aceptar que esto es una gran pérdida de tiempo para que funcione como se espera. –

+0

Mientras esto funciona, sigue siendo un truco. Uno esperaría que los marcos/límites se resolvieran a partir de las restricciones establecidas en la UITableViewCell personalizada. –

1

trate de cambiar la propiedad "contentMode" de imageView a 'UIViewContentModeScaleAspectFit' o 'UIViewContentModeScaleAspectFill'

+1

Gracias, he intentado su recomendación, pero no funcionó. Me di cuenta de que cualquier valor que establezca en contentMode and bounds no tiene ningún efecto. He editado mi primera publicación para reflejar esto. –

2

"UIViewContentModeCenter || UIViewContentModeRedraw" es equivalente a 1. No es también un campo de bits. Desea UIViewContentModeCenter.

UITableViewCell.imageView es administrado por la célula. Si desea un diseño personalizado, trate de añadir una vista a contentView (supongo que lo que entendemos por "centrada en un área de 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

¡Gracias! Resolví el problema sin usar la vista de contenido. Voy a marcar la pregunta como respondida después de 2 días =) –

10

Así que el problema con UITableViewCell 's es que usted tiene no hay control sobre el tamaño de los objetos incorporados (a saber, imageView, contentView, accessoryView, backgroundView). Cuando la tabla cambia, tus personalizaciones son pisoteadas.

Puede, como Behlul señaló, la fuerza de los tamaños de ser correcta utilizando layoutSubviews, pero el problema con esto es que layoutSubviews se llama cada vez que los rollos de mesa. Esa es una gran cantidad de llamadas de reorganización innecesarias.

Una alternativa, el método es añadir todos de su contenido a la contentView.Del mismo modo, si va a personalizar el fondo, puede crear un sistema transparente backgroundView y añadir su vista personalizada de fondo (por ejemplo myBackgroundView) como subvista de backgroundView.

De esta manera usted puede colocar y clasificar sus artículos como usted quiera.

El inconveniente es que los mensajes estándar ya no se reciben de las vistas de accesorios o imágenes. Solo tienes que crear tu propia.

Espero que ayude!

// 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

Este es en realidad el mejor método que la respuesta seleccionada. También puede crear una UITableViewCell a través de un xib, si así lo desea. Aquí hay un tutorial sobre esto: http://ijoshsmith.com/2011/07/16/creating-a-custom-uitableviewcell-in-ios-4/ –

+0

Esto fue lo mejor para mí. –

0

Crear subclase de 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 
Cuestiones relacionadas