2012-10-05 9 views
6

Devo creare un UICollectionViewCell personalizzato per mostrare un'immagine e un nome per l'immagine E, sopra l'immagine, c'è un'immagine di fotogramma di 2 pixel più grande in larghezza e altezza rispetto all'immagine. Tuttavia, qualunque cosa faccia, l'immagine sembra essere più grande dell'immagine del frame. Ho fatto la stessa cosa per la vista del tavolo, e funziona perfettamente.UIImageView mostra l'immagine senza limiti in una sottoclasse UICollectionViewCell

Ecco il codice:

//GridCell.h 

@interface GridCell : UICollectionViewCell 
@property(nonatomic, strong) UILabel *lblName; 
@property(nonatomic, strong) UIImageView *image; 
@end 

//GridCell.m 

#import "GridCell.h" 

@implementation GridCell 

@synthesize image, lblName; 

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     // Initialization code 

     UIImage *bg = [UIImage imageNamed:@"borderUIimgLg.png"]; 

     UIImageView *bgImage = [[UIImageView alloc] initWithFrame:CGRectMake(0.0, 0.0, frame.size.width, frame.size.width)]; 
     [bgImage setImage:bg]; 
     [bgImage setContentMode:UIViewContentModeScaleAspectFill]; 
     NSLog(@"BG Image size %f, %f", bgImage.frame.size.width, bgImage.frame.size.height); 


     UIImageView *contentImage = [[UIImageView alloc] initWithFrame:CGRectMake(2.0, 2.0, frame.size.width-4.0, frame.size.width-4.0)]; 
     [contentImage setContentMode:UIViewContentModeScaleAspectFill]; 
     [contentImage setClipsToBounds:YES]; 
     self.image = contentImage; 

     [self.contentView addSubview:self.image]; 

     [self.contentView addSubview:bgImage]; 

     UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(2.0, frame.size.width, frame.size.width - 4.0, 21.0)]; 
     [label setFont:[UIFont fontWithName:@"HelveticaNeue-Bold" size:11.0]]; 
     [label setTextAlignment:NSTextAlignmentCenter]; 
     [label setBackgroundColor:[UIColor clearColor]]; 
     self.lblName = label; 
     [self.contentView addSubview:self.lblName]; 
    } 
    return self; 
} 

L'UICollectionViewCell ha una dimensione di 67 x 100, quindi nel codice, il bgImage dovrebbe essere sempre essere 67 x 67 e la sua origine è (0,0) e il contentImage dovrebbe avere un frame di (0,0,63,63). Con il debug, sembra corretto. Tuttavia, il conentimage è sempre più grande di bgImage. La dimensione originale dell'immagine è 80 x 80 però. Ho provato setClipToBounds, setContentViewMode su cell.ContentView o imageView, ma nessuno funziona.

Uno screenshot sul problema è allegato. Image in UIImage view out of bounds

Qualsiasi aiuto è apprezzato.

+0

Ho anche provato a impaginare tutti gli elementi in un pennino e nello storyboard, ottenere gli stessi risultati. – Zhao

risposta

1

si utilizza 2 volte frame.size.width invece di frame.size.height sull'altro

modificare, provare questo:

in cella, quando si utilizzano i metodi initWithFrame, usare l'auto Proprietà .bounds della cella. se init imageview all'interno del bordo utilizzare il metodo CGRectInset per inizializzare l'imageview con limiti più piccoli e impostare il centro imageviews alla stessa della contentView della cella

+0

questo è quello che volevo, per rendere l'immagine uguale larghezza e altezza, che è uguale alla larghezza della cella – Zhao

+0

Funziona Grazie mille :) Ho cambiato 'UIImageView * contentImage = [[UIImageView alloc] initWithFrame: CGRectMake (2.0, 2.0, frame.size.width-4.0, frame.size.width-4.0)];' a 'UIImageView * contentImage = [[UIImageView alloc] initWithFrame : CGRectInset (bgImageView.bounds, 6, 6)]; 'e la magia accade. Devo capire qual è la differenza per questi due. 4.0 o 6.0 non importa, solo 6.0 è il migliore per la mia app. – Zhao

0

Provare a modificare UIViewContentModeScaleAspectFill su UIViewContentModeScaleAspectFit.

+0

Ho provato sia Fill and Fit che sfortuna. Ho appena provato di nuovo, non funzionante :( – Zhao

23

Questo potrebbe aver trovato la risposta, ormai, provare:

contentImage.clipsToBounds = YES;