2012-09-23 4 views
23

Sono molto nuovo all'obiettivo c e sto solo cercando di orientarmi. Voglio fare qualcosa di veramente semplice ma si rivela una vera sfida:Ridimensionamento immagine per adattarsi UIImageView

Sto provando a visualizzare un'immagine in un UIImageView. L'immagine che sto mostrando è grande e voglio ridurla per adattarla allo UIImageView. Ho provato a impostare la modalità di visualizzazione AspectFit ma l'immagine viene visualizzata alla dimensione originale e viene ritagliata dallo UIImageView. Il mio codice è qui sotto:

- (void)changeImages 
{ 
    UIImage* img11 = nil; 

    img11 = [UIImage imageWithContentsOfFile: [[NSBundle mainBundle] pathForResource:@"dog" ofType:@"jpeg"]]; 

    u11.contentMode = UIViewContentModeScaleAspectFit; 
    u11.image = img11; 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 

    [self changeImages]; 
} 

Qualcuno può far luce su questo per favore?

Grazie!

+1

hai letto http://stackoverflow.com/questions/185652/how-to-scale-a -uiimageview-proporzionalmente? Soprattutto la seconda risposta potrebbe essere di interesse. –

+0

Con tutti i diritti, questo dovrebbe funzionare. Cose da controllare: stai già impostando l'immagine nel pennino/storyboard? Se è così, questo potrebbe mascherare il codice che non viene chiamato. ChangeImages viene chiamato? Puoi effettuare una chiamata a 'NSLog (@" changeImages called ")' per vedere se lo è, o usare un breakpoint. Se non lo è, potresti aver dimenticato di cambiare la classe del ViewController nel tuo pennino/storyboard nella classe del codice che hai scritto sopra. 'U11' è specificato come IBOutlet e correttamente collegato al pennino/storyboard? – Xono

+0

Se sei un neofita dell'obiettivo c, forse la cosa migliore è usare la terza libreria sul ridimensionamento delle immagini come https://github.com/mattgemmell/MGImageUtilities – martinezdelariva

risposta

31

Salve vorrei provare questo ...

- (void)changeImages 
{ 
    UIImage *img11 = [UIImage [email protected]"dog.jpeg"]; 

    u11.contentMode = UIViewContentModeScaleAspectFit; 
    u11.clipsToBounds = YES; 
    [u11 setImage:img11]; 
} 

- (void)viewWillAppear:animated 
{ 
    [super viewWillAppear:animated]; 

    [self changeImages]; 
} 

Questa scalerà l'immagine (su o giù) in modo che si adatti all'interno del ImageView. La presenza di clipToBounds non è necessaria ma interromperà la visualizzazione dell'immagine al di fuori della cornice di imageView.

HTH.

4
CGSize size=CGSizeMake(79, 84);//set the width and height 
UIGraphicsBeginImageContext(size); 
[image drawInRect:CGRectMake(0,0,size.width,size.height)]; 
UIImage * newImage = UIGraphicsGetImageFromCurrentImageContext(); 
//here is the scaled image which has been changed to the size specified 
UIGraphicsEndImageContext(); 

Questo funziona di sicuro e non dimenticate di importare QuartzCore FrameWork ..

avere un felice Coding (^ _ ^) ....

+0

+1 per il metodo Quartz. Fa un lavoro di ridimensionamento migliore rispetto alla proprietà contentMode standard di 'UIKit'. – danielbeard

+0

funziona davvero molto bene grazie :) –

16

Aggiungi alla tua UIViewController.m:

-(UIImage *)resizeImage:(UIImage *)image imageSize:(CGSize)size 
{ 
    UIGraphicsBeginImageContext(size); 
    [image drawInRect:CGRectMake(0,0,size.width,size.height)]; 
    UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext(); 
    // here is the scaled image which has been changed to the size specified 
    UIGraphicsEndImageContext(); 
    return newImage; 
} 

Usando:

UIImage *image = [UIImage imageNamed:@"image.png"]; 
CGSize size = CGSizeMake(50, 63); // set the width and height 
UIImage *resizedImage = [self resizeImage:image imageSize:size]; 

Spero che aiuti.

+0

Quindi se ho un UITableView che sta ottenendo i miei dati online per popolare l'immagine di UITableViewCells e voglio ridimensionare la mia immagine in questo modo per migliorare le prestazioni, posso chiamare questo metodo in cellForRowAtIndexPath? –

1

È anche possibile impostare Vista: Modalità di Aspect Fit in Impostazioni Attributi in Interface Builder

0

Ho fatto la seguente ed è aiutato Passare alla modalità di "aspetto riempire" dal valore di default "Scala per riempire"

e aggiungere una riga di codice come segue (l'ho fatto in una configurazione di cella):

cell.photo.clipsToBounds = true