2012-10-05 7 views
6

Muszę utworzyć dostosowujący UICollectionViewCell, aby wyświetlić obraz i nazwę obrazu, a na górze obrazu znajduje się obraz klatki o 2 piksele większy w szerokość i wysokość niż obraz. Jednak niezależnie od tego, co robię, obraz wydaje się większy niż obraz klatki. Zrobiłem to samo dla widoku tabeli i działa idealnie.UIImageView wyświetla obraz poza zakresem w podklasie UICollectionViewCell

Oto kod:

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

UICollectionViewCell ma rozmiar 67 x 100, więc w kodzie bgImage powinien być zawsze być 67 x 67 i jego pochodzenie jest (0,0) i contentImage powinno mieć ramkę (0,0,63,63). Przez debugowanie wydaje się poprawne. Jednak conentimage zawsze większy niż bgImage. Oryginalny rozmiar obrazu to jednak 80 x 80. Próbowałem setClipToBounds, setContentViewMode na cell.ContentView lub imageView, ale żaden nie działa.

Zrzut ekranu przedstawiający problem został załączony. Image in UIImage view out of bounds

Każda pomoc jest doceniana.

+0

Próbowałem również rozmieścić wszystkie elementy w stalówce i scenorysie, uzyskać takie same wyniki. – Zhao

Odpowiedz

1

używasz 2 razy frame.size.width zamiast frame.size.height na drugim

edycji, spróbuj tego:

w komórce, przy użyciu metod initWithFrame użyj siebie .bounds właściwość komórki. jeśli init ImageView wewnątrz granicy użyć metody CGRectInset aby zainicjować ImageView z mniejszych granicach i ustawić centrum imageviews do sama jak contentView komórki

+0

to jest to, co chciałem, aby obraz miał równą szerokość i wysokość, która jest taka sama jak szerokość komórki. – Zhao

+0

To działa. Wielkie dzięki. :) Zmieniłem 'UIImageView * contentImage = [[Przypisanie UIImageView] initWithFrame: CGRectMake (2.0, 2.0, frame.size.width-4.0, frame.size.width-4.0)];' to 'UIImageView * contentImage = [[Przypisanie UIImageView] initWithFrame : CGRectInset (bgImageView.bounds, 6, 6)]; 'i magia się dzieje. Muszę dowiedzieć się jaka jest różnica dla tych dwóch. 4.0 lub 6.0 nie ma znaczenia, tylko 6.0 jest najlepszy dla mojej aplikacji. – Zhao

0

Spróbuj zmienić UIViewContentModeScaleAclipapFill na UIViewContentModeScaleAspectFit.

+0

Próbowałem zarówno Fill i Fit i bez powodzenia. po prostu próbowałem ponownie, nie działa :( – Zhao

23

ten mógłby znaleźć odpowiedź teraz, spróbuj:

contentImage.clipsToBounds = YES;