2012-10-05 15 views
6

Ich muss eine benutzerdefinierte UICollectionViewCell erstellen, um ein Bild und einen Namen für das Bild anzuzeigen, und oben auf dem Bild gibt es ein Bild, das 2 Pixel größer ist Breite und Höhe als das Bild. Aber egal, was ich mache, das Bild scheint größer als das Bild zu sein. Ich habe das gleiche für die Tischansicht getan, und es funktioniert perfekt. HierUIImageView Bild außerhalb der Grenzen in einer UICollectionViewCell Unterklasse anzeigen

ist der Code:

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

Die UICollectionViewCell hat eine Größe von 67 x 100, so in dem Code, die bgImage sollte immer sein, seine 67 x 67 und sein Ursprung (0,0) und das contentImage sollte einen Rahmen von (0,0,63,63) haben. Durch das Debuggen scheint es korrekt zu sein. Das contentimage ist jedoch immer größer als das bgImage. Die Originalgröße des Bildes beträgt 80 x 80. Ich habe versucht, setClipToBounds, setContentViewMode auf der Zelle.ContentView oder der ImageView, aber keiner funktioniert.

Ein Screenshot über das Problem ist beigefügt. Image in UIImage view out of bounds

Jede Hilfe wird geschätzt.

+0

Ich habe auch versucht, alle Elemente in einer Feder und im Storyboard Layout, die gleichen Ergebnisse zu erhalten. – Zhao

Antwort

1

Sie 2 mal verwenden frame.size.width statt frame.size.height auf der anderen

bearbeiten, versuchen Sie dies:

in der Zelle, wenn Initwithframe Methoden verwenden, verwenden Sie die Selbst .bounds Eigenschaft der Zelle. , wenn Sie die Imageview innerhalb der Grenze verwenden CGRectInset Methode init den Imageview mit kleineren Grenzen zu initialisieren und das imageviews Zentrum genau so wie die InhaltAlle der Zelle

+0

das ist eigentlich, was ich wollte, um das Bild haben gleiche Breite und Höhe, die die gleiche Breite der Zelle ist. – Zhao

+0

Es funktioniert. Vielen Dank. :) Ich habe geändert 'UIImageView * contentImage = [[UIImageView Alloc] initWithFrame: CGRectMake (2.0, 2.0, frame.size.width-4.0, frame.size.width-4.0)];' bis 'UIImageView * contentImage = [[UIImageView Alloc] initWithFrame : CGRectInset (bgImageView.bounds, 6, 6)]; 'und Magie passiert. Ich muss herausfinden, was der Unterschied für diese beiden ist. 4.0 oder 6.0 spielt keine Rolle, nur 6.0 ist das Beste für meine App. – Zhao

0

Versuchen Sie, UIViewContentModeScaleAspectFill zu UIViewContentModeScaleAspectFit zu ändern.

+0

Ich habe sowohl Fill and Fit als auch kein Glück versucht. nur noch einmal versucht, nicht funktioniert :( – Zhao

23

Dies könnte jetzt die Antwort gefunden haben, versuchen Sie:

contentImage.clipsToBounds = YES; 
Verwandte Themen