2009-06-28 5 views
25

Ich benutze die gleichen großen Bilder in einem TableView und DetailView. Müssen BildView in 40x40 ausgefüllt werden, wenn ein Imags in TableView angezeigt wird, aber auf einer Hälfte eines Bildschirms gestreckt. Ich spielte mit mehreren Eigenschaften, haben aber kein positives Ergebnis:UITableViewCells imageView passt zu 40x40

[cell.imageView setBounds:CGRectMake(0, 0, 50, 50)]; 
[cell.imageView setClipsToBounds:NO]; 
[cell.imageView setFrame:CGRectMake(0, 0, 50, 50)]; 
[cell.imageView setContentMode:UIViewContentModeScaleAspectFill]; 

ich verwende SDK 3.0 mit Build-in „Zellobjekte in Vordefinierte Styles“.

+0

Ich habe auch dieses Problem. Ich versuchte auch imageView.contentMode = UIViewContentModeScaleAspectFit. –

Antwort

-1

können Sie dies möglicherweise verwenden?

yourTableViewController.rowImage = [UIImage imageNamed:@"yourImage.png"]; 

und/oder

cell.image = yourTableViewController.rowImage; 

und wenn Ihre Bilder sind bereits 40x40 dann sollten Sie nicht über das Festlegen von Grenzen und Sachen zu kümmern ... aber, sie ist dazu auch neue, also, ich würde nicht wissen, habe nicht mit Table View Zeile/Zelle Bilder viel gespielt

hoffe, dass dies hilft.

+0

Nein, ich brauche das nicht. Ich brauche große Bilder zu verwenden. – slatvick

+0

Er bedeutet, die Größe zu ändern, obwohl Sie das Bild korrekt eingestellt haben. – JoePasq

-1

Ich konnte dies mit Interface Builder und einer Tableviewcell arbeiten. Sie können die "Modus" -Eigenschaften für eine Bildansicht auf "Aspect Fit" einstellen. Ich bin mir nicht sicher, wie ich das programmatisch machen soll.

+0

Dies ist, wie Sie es programmgesteuert tun würden: yourTableViewCell.imageView.contentMode = UIViewContentModeScaleAspectFit; – Jonah

+0

das funktioniert, sicherlich, aber die Verwendung von IB ist eine Menge Overhead, nur um die Größe eines Bildes zu ändern – greenisus

-1

Versuchen Sie die Einstellung UIImageView.autoresizesSubviews und/oder UIImageView.contentStretch.

4

Ich habe mich in einem UIView gewickelt und diesen Code verwenden:

imageView.contentMode = UIViewContentModeScaleAspectFit; 
imageView.autoresizingMask = UIViewAutoresizingFlexibleWidth |UIViewAutoresizingFlexibleHeight; 
[self addSubview:imageView]; 
imageView.frame = self.bounds; 

(Selbst ist die Umhüllung UIView, mit den Abmessungen ich will - ich verwende AsyncImageView).

12

Ich cache eine Thumbnail-Version, da die Verwendung von großen Bildern im laufenden Betrieb zu viel Speicher verbraucht.

Hier ist meine Miniatur Code:

- (UIImage *)thumbnailOfSize:(CGSize)size { 
    if(self.previewThumbnail) 
     return self.previewThumbnail; // returned cached thumbnail 

    UIGraphicsBeginImageContext(size); 

    // draw scaled image into thumbnail context 
    [self.preview drawInRect:CGRectMake(0, 0, size.width, size.height)]; 

    UIImage *newThumbnail = UIGraphicsGetImageFromCurrentImageContext();  

    // pop the context 
    UIGraphicsEndImageContext(); 

    if(newThumbnail == nil) 
     NSLog(@"could not scale image"); 

    self.previewThumbnail = newThumbnail; 

    return self.previewThumbnail; 
} 

So stellen Sie sicher, dass Sie richtig die zwischengespeicherte Miniatur löschen, wenn Sie das Originalbild ändern (self.preview in meinem Fall).

+0

Wo gebe ich das? Auch ist Self.previewThumbnail ein UIImage? Was ist schließlich self.preview? Ein Bild, eine Ansicht? – zardon

+0

Das ist toll, aber wäre eine benutzerdefinierte Zelle mit entsprechendem Layout nicht effizienter? – spstanley

+0

Ich bin mir nicht sicher, wie das zusammenhängt? Sie können diesen Code definitiv in einer benutzerdefinierten Zelle verwenden. Es erstellt nur ein Thumbnail aus einem größeren Bild. –

2

Ich dachte, Ben Lachmans Vorschlag, Thumbnails im Vorraus und nicht im Flug zu erstellen, war schlau, also passte ich seinen Code so an, dass er ein ganzes Array handhaben und portabler machen konnte (keine fest codierten Property-Namen).

- (NSArray *)arrayOfThumbnailsOfSize:(CGSize)size fromArray:(NSArray*)original { 
    NSMutableArray *temp = [NSMutableArray arrayWithCapacity:[original count]]; 
    for(UIImage *image in original){ 
     UIGraphicsBeginImageContext(size); 
     [image drawInRect:CGRectMake(0,0,size.width,size.height)]; 
     UIImage *thumb = UIGraphicsGetImageFromCurrentImageContext(); 
     UIGraphicsEndImageContext(); 
     [temp addObject:thumb]; 
    } 
    return [NSArray arrayWithArray:temp]; 
} 
32

habe ich Bens Code als Erweiterung in meinem NS-Extensions-Datei so, dass ich jedes Bild sagen kann, ein Miniaturbild von sich selbst zu machen, wie in:

UIImage *bigImage = [UIImage imageNamed:@"yourImage.png"]; 
UIImage *thumb = [bigImage makeThumbnailOfSize:CGSizeMake(50,50)]; 

Hier ist h-Datei:

@interface UIImage (PhoenixMaster) 
- (UIImage *) makeThumbnailOfSize:(CGSize)size; 
@end 

und dann in der NS-Extensions.m Datei:

@implementation UIImage (PhoenixMaster) 
- (UIImage *) makeThumbnailOfSize:(CGSize)size 
{ 
    UIGraphicsBeginImageContextWithOptions(size, NO, UIScreen.mainScreen.scale); 
    // draw scaled image into thumbnail context 
    [self drawInRect:CGRectMake(0, 0, size.width, size.height)]; 
    UIImage *newThumbnail = UIGraphicsGetImageFromCurrentImageContext();   
    // pop the context 
    UIGraphicsEndImageContext(); 
    if(newThumbnail == nil) 
     NSLog(@"could not scale image"); 
    return newThumbnail; 
} 

@end 
+4

Verwenden Sie bei Retina-Anzeigen 'UIGraphicsBeginImageContextWithOptions()', um eine unscharfe Größenänderung zu vermeiden. :) – toblerpwn

+1

@ toblerpwn's Note ist wichtig, also habe ich die Antwort bearbeitet, um dies zu reflektieren. Es wird jetzt unabhängig von der Bildschirmgröße korrekt funktionieren. – devios1

+0

@chaiguy Wie bekomme ich eine nicht sichtbare Schnittstelle für '' deklariert den Selektor 'drawInRect "'? Bitte helfen – 4GetFullOf