2010-10-16 9 views
1

J'utilise une image pour afficher tout le contenu d'un UITableViewCell et il est défini en utilisant la propriété backgroundView.UITableViewCell backgroundAffichage de redimensionnement d'image?

Mon problème est qu'il est toujours mis à l'échelle pour s'adapter à la cellule. Y at-il un moyen de désactiver la mise à l'échelle dans ce cas, donc je peux fournir la version 480 pixels seulement et il est juste recadré lorsque l'orientation est portrait?

que je fais comme ça:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {  
    static NSString *CellIdentifier = @"Cell"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
    } 
     UIImageView *bgView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:[NSString stringWithFormat:@"menu.0%d.large.png", indexPath.row+1]]]; 
     UIImageView *selectedBgView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:[NSString stringWithFormat:@"menu.0%d.large.selected.png", indexPath.row+1]]];  
     cell.backgroundView = bgView; 
     cell.selectedBackgroundView = selectedBgView;   
     [bgView release]; 
     [selectedBgView release]; 
    return cell; 
} 

J'ai essayé d'utiliser deux versions des images pour basculer entre eux lorsque l'orientation est modifiée. Cela fonctionne aussi jusqu'à présent, mais l'inconvénient est que vous voyez toujours la mise à l'échelle pendant le traitement de l'animation.

Merci pour votre aide

Arne

Répondre

1

Je n'ai pas essayé cela sur le simulateur ou un dispositif, mais ce qui suit pourrait fonctionner:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {  
static NSString *CellIdentifier = @"Cell"; 

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
if (cell == nil) { 
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
} 
    // New! 
    cell.backgroundView.clipsToBounds = YES; 

    UIImageView *bgView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:[NSString stringWithFormat:@"menu.0%d.large.png", indexPath.row+1]]]; 
    UIImageView *selectedBgView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:[NSString stringWithFormat:@"menu.0%d.large.selected.png", indexPath.row+1]]];  
    // New! 
    bgView.center = CGPointMake(160, 25); // Adjust the y-Value to be exactly half of the height of your cell 
    bgView.autoresizingMask = UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleLeftMargin; // Not quite sure whether these two will work, maybe you have to play a little with the Masks 

    cell.backgroundView = bgView; 
    cell.selectedBackgroundView = selectedBgView;   
    [bgView release]; 
    [selectedBgView release]; 
return cell; 
} 

Laissez-moi savoir si vous avez réussi à le faire fonctionner.

+0

Merci pour votre réponse. J'étais trop tard pour vérifier, car j'avais déjà trouvé la solution de James quand je suis revenu. Mais merci pour votre aide de toute façon! – arnekolja

+0

Merci! J'ai utilisé le 'UIViewContentModeTopLeft' en combinaison avec' clipToBounds = YES' pour le faire fonctionner pour mon projet. – primehalo

6

Définissez le mode de contenu de vos vues d'arrière-plan.

bgView.contentMode = UIViewContentModeTopLeft; 
selectedBgView.contentMode = UIViewContentModeTopLeft; 

Cela indique au UIImageView de mettre son image dans le coin en haut à gauche plutôt que pour l'adapter à l'échelle.

+0

Je ne savais pas celui-là, beaucoup plus intelligent (et plus court) que mon idée :) – Robin

+0

Parfois, il est payant d'être paresseux. :) C'est une propriété de 'UIView', donc c'est pratique dans quelques endroits. –

+0

Je jouais avec contentMode, mais il semble que je l'ai fait au mauvais endroit. Merci, ça marche comme un charme :) – arnekolja