2012-07-24 9 views
5

EDIT:.modo UIViewContentModeScale del cambio de imagen celular en silencio después de la célula se toca (resaltado)

consigo el problema fijado por crear una célula Personalizar (. Sin embargo, todavía tiene otra questions) ¿Pero por qué la célula por defecto no funciona sigue siendo un misterio ...

La respuesta de Cory no solucionó el problema, pero clipsToBounds es realmente un punto y aprecié su ayuda continua. Entonces le doy la recompensa pero no acepto su respuesta como la respuesta. La respuesta todavía en el viento ....

================================

Establecí el modo UIViewContentModeScale de la imagen de la celda en AspectFill (imagen de la izquierda) y la imagen se visualizó correctamente (Complete la vista de la imagen pero mantenga el aspecto). Sin embargo, después de tocar y mantener presionada la celda, la imagen cambiará: el marco de la vista de imagen y el modo de vista de contenido se cambian. (vea la primera celda de la imagen de la izquierda a continuación)

Esto está realmente conectado y puedo creer que algo básico podría salir mal así que debe haber algunas cosas que me estaba perdiendo.

Entorno: Xcode 4.3 iOS5.1 simulador & dispositivo. enter image description here

Actualización:

que establece la UIViewContentMode mediante el inspector del guión gráfico.

Y, por cierto, utilicé SDWebImage/UIImageView + WebCache.h.

Update2:

que establece explícitamente el modo de contenido en el código, pero problema sigue ahí. [cell.imageView setContentMode: UIViewContentModeScaleAspectFill];

Update4:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"AlbumCell"]; 

    if(cell == nil){ 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"AlbumCell"]; 

    } 
    //[cell.imageView setContentMode:UIViewContentModeScaleAspectFill]; 
    //[cell.imageView setClipsToBounds:YES]; 
    [self configureCell:cell atIndexPath:indexPath]; 
    return cell; 
} 
- (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath 
{ 
    Album *album = [self.fetchedResultsController objectAtIndexPath:indexPath]; 
    cell.textLabel.text = [album.title description];  
    cell.detailTextLabel.text = [self.userVisiableDateFormatter stringFromDate:album.releaseDate]; 


    //[cell.imageView setContentMode:UIViewContentModeScaleAspectFill]; 
    [cell.imageView setImageWithURL:[NSURL URLWithString:album.coverThumbnailUrl] 
       placeholderImage:[self placeHolderImage]]; 

} 

enter image description here

+0

¿En qué método configuras el modo de contenido? Muéstranos el origen de ese método. –

+0

@rob Establecí la atribución utilizando el inspector de atribución del guión gráfico. – pierrotlefou

+0

Intente usar el modo de contenido scaleToFill – Mrunal

Respuesta

8

yo era capaz de encontrar un par de cosas diferentes que podrían ser el problema.

En primer lugar, tratar de establecer la propiedad clipsToBounds:

img1.contentMode = UIViewContentModeScaleAspectFill; 
img1.clipsToBounds = YES; 

El segundo es:

La razón por la que no se ve una diferencia entre esos modos es que el UITableViewCell automáticamente el tamaño de la vista de la imagen para adaptarse la relación de aspecto de la imagen. Los modos de contenido solo entran en juego cuando la relación de aspecto de la vista es diferente de la de la imagen.

O bien anula el diseño. Publica las opiniones en la clase UITableViewCell personalizada o crea una vista de imagen tú mismo (no uses la que proporciona la celda de la vista de tabla).

EDIT 1:

Después de mirar el código del problema puede estar en la forma en que su manejo de la configuración de su celda. Los indicadores pueden ser liberados cuando no deberían.Pruebe estas 2 opciones:

Opción 1: Mantenga su método actual de pasar la configuración a un nuevo método.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"AlbumCell"]; 

    if(cell == nil){ 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"AlbumCell"]; 

    } 

    return [self configureCell:cell atIndexPath:indexPath]; 
} 

- (UITableViewCell*)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath 
{ 
    UITableViewCell* returnCell = cell; 

    Album *album = [self.fetchedResultsController objectAtIndexPath:indexPath]; 
    returnCell.textLabel.text = [album.title description];  
    returnCell.detailTextLabel.text = [self.userVisiableDateFormatter stringFromDate:album.releaseDate]; 


    [returnCell.imageView setContentMode:UIViewContentModeScaleAspectFill]; 
    [returnCell.imageView setClipsToBounds:YES]; 

    [returnCell.imageView setImageWithURL:[NSURL URLWithString:album.coverThumbnailUrl] 
       placeholderImage:[self placeHolderImage]]; 

    return returnCell; 
} 

Opción 2: (mi recomendación) Configurar la célula en el método delegado. Está bien hacer esto aquí y no es una mala práctica. Este es el método de delegado para configurar la celda.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"AlbumCell"]; 

    if(cell == nil){ 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"AlbumCell"]; 

    } 


    Album *album = [self.fetchedResultsController objectAtIndexPath:indexPath]; 
    cell.textLabel.text = [album.title description];  
    cell.detailTextLabel.text = [self.userVisiableDateFormatter stringFromDate:album.releaseDate]; 

    [cell.imageView setContentMode:UIViewContentModeScaleAspectFill]; 
    [cell.imageView setClipsToBounds:YES]; 

    [cell.imageView setImageWithURL:[NSURL URLWithString:album.coverThumbnailUrl] 
       placeholderImage:[self placeHolderImage]]; 


    return cell; 
} 
+0

+1. Sin embargo, configuré clipstoBounds en true, pero el problema persiste. – pierrotlefou

+0

¿Está utilizando celdas personalizadas o las predeterminadas? Intento recrear el error yo mismo para ayudar a diagnosticar el problema. – random

+0

estaba usando la celda predeterminada. – pierrotlefou

3

establece la misma imagen para el estado resaltado también.

3

podría ser el caso de que tenga que configurar su auto-redimensionamiento (o puntales & resortes, si ha aprendido esa terminología).

en una aplicación en la que tengo una celda personalizado con una imagen en el similares izquierda a la suya, yo he puesto mi tamaño automático como en la siguiente imagen:

enter image description here

nota que lo tengo configurar para que el tamaño permanezca constante dentro del marco de la celda, y que los tamaños superior, inferior e izquierdo reciban la orden de abrazar esos bordes con tanta separación en cada lado.

Aparte de eso, creo que tienes razón en que el aspectFill es la opción para esa configuración. clipToBounds realmente no debería importar; solo será necesario si esa vista fuera una subvista de otra vista en la que supuestamente apareciera donde su tamaño fuera mayor que la vista de la que es una subvista.

+0

john, lo intenté pero no tuve suerte. – pierrotlefou

+0

tenga en cuenta también que estoy usando una celda personalizada para esto. Ha pasado un tiempo, pero parece recordar que tuve problemas similares w.r.t. ser capaz de establecer el "espacio en blanco" en la parte superior, inferior e izquierda como lo deseé usando la celda predeterminada. si está interesado en tener el espacio en blanco y la vista de imagen cuadrada específica, puede que tenga que hacer lo mismo para garantizar lo que desea. Si está satisfecho con llenar el espacio con la imagen pero desea que la imagen inicial también llene el espacio, es posible que deba usar una imagen predeterminada más grande en el campo de imagen de su celda. De todos modos, mi celda personalizada fue bastante fácil de crear. –

2

Encontré un problema similar para una UITableViewCell subclasificada con una propiedad subclase UIImageView. Cambiar el nombre de esta propiedad de 'imageView' a otra cosa me solucionó el problema.

+1

¡gracias! resolvió este problema para mí! – schirrmacher

Cuestiones relacionadas