2013-02-01 11 views
21

Ho questo UIImageView e ho i valori della sua altezza massima e larghezza massima. Quello che voglio ottenere è che voglio prendere l'immagine (con qualsiasi proporzione e qualsiasi risoluzione) e voglio che si adatti ai bordi, quindi l'immagine non supera, ma può ridurli come vuole . (Segnato in rosso nella foto):Ridimensiona UIImmagine e modifica la dimensione di UIImageView

enter image description here

In questo momento l'immagine si adatta alle dimensioni necessarie correttamente, ma ho 2 preoccupazioni: 1. Il UIImageView non è uguale la dimensione dell'immagine ridimensionata, lasciando così sfondo rosso (e io non lo voglio) 2. Se l'immagine è più piccola che l'altezza del mio UIImageView non è ridimensionata per essere più piccola, rimane la stessa altezza.

Ecco il mio codice e so il suo male:

UIImage *actualImage = [attachmentsArray lastObject]; 
UIImageView *attachmentImageNew = [[UIImageView alloc] initWithFrame:CGRectMake(5.5, 6.5, 245, 134)]; 
attachmentImageNew.image = actualImage; 
attachmentImageNew.backgroundColor = [UIColor redColor]; 
attachmentImageNew.contentMode = UIViewContentModeScaleAspectFit; 

Così come faccio a cambiare dinamicamente la dimensione non solo della UIImageView.image, ma di tutta la UIImageView, rendendo così la sua dimensione completamente regolabile per il suo contenuto. Qualsiasi aiuto sarebbe molto apprezzato, grazie!

risposta

30

Quando si ottiene la larghezza e l'altezza di un'immagine ridimensionata Get width of a resized image after UIViewContentModeScaleAspectFit, è possibile ridimensionare la tua IMAGEVIEW:

imageView.frame = CGRectMake(0, 0, resizedWidth, resizedHeight); 
imageView.center = imageView.superview.center; 

non ho controllato se funziona, ma penso che tutti dovrebbero essere OK

+1

se dopo superview non aggiungo '!' mi dà errore 'valore di tipo opzionale' UIView? ' non scartato 'è corretto se utilizzo'! ' : imageView.center = imageView.superview! .center; – Alex

+0

Cosa succede se stai utilizzando il layout automatico? Non dovresti impostare 'frame'? –

1

Se si dispone della dimensione dell'immagine, perché non si imposta la dimensione dell'immagine come frame.size della vista dell'immagine?

EDIT ----

Ok, in modo da vedere il tuo commento vi propongo questo:

UIImageView *imageView; 
//so let's say you're image view size is set to the maximum size you want 

CGFloat maxWidth = imageView.frame.size.width; 
CGFloat maxHeight = imageView.frame.size.height; 

CGFloat viewRatio = maxWidth/maxHeight; 
CGFloat imageRatio = image.size.height/image.size.width; 

if (imageRatio > viewRatio) { 
    CGFloat imageViewHeight = round(maxWidth * imageRatio); 
    imageView.frame = CGRectMake(0, ceil((self.bounds.size.height - imageViewHeight)/2.f), maxWidth, imageViewHeight); 
} 
else if (imageRatio < viewRatio) { 
    CGFloat imageViewWidth = roundf(maxHeight/imageRatio); 
    imageView.frame = CGRectMake(ceil((maxWidth - imageViewWidth)/2.f), 0, imageViewWidth, maxHeight); 
} else { 
    //your image view is already at the good size 
} 

Questo codice sarà ridimensionare la visualizzazione dell'immagine per il suo rapporto di immagine, e anche posizionare la visualizzazione dell'immagine al stesso centro della tua posizione "predefinita".

PS: Spero che si sta impostando imageView.layer.shouldRasterise = YES e imageView.layer.rasterizationScale = [UIScreen mainScreen].scale;

se si sta utilizzando effetto ombra CALayer;) Si migliorerà notevolmente le prestazioni del vostro utente.

+0

Perché pensi che lo sto ridimensionando con 'attachmentImageNew.contentMode = UIViewContentModeScaleAspectFit'? Perché l'immagine è troppo grande. Non posso impostare la dimensione di 'imageView' per essere esatto della dimensione della sua immagine, perché ho il valore massimo per la sua altezza e larghezza. E quasi il 90% delle immagini deve essere ridimensionato. –

0

Penso che quello che vuoi sia un altro content mode. Prova a utilizzare UIViewContentModeScaleToFill. Questo ridimensiona il contenuto per adattarlo alle dimensioni di UIImageView cambiando le proporzioni del contenuto, se necessario.

Dai un'occhiata alla sezione content mode sul documento ufficiale per avere un'idea migliore della diversa modalità di contenuto disponibile (è illustrata con le immagini).

+0

L'ho provato e va oltre i limiti del mio 'UIImageView' nella galassia molto lontana –

+0

Questo suona come un insetto di guerre stellari quindi :-) – tiguero

+0

Beh, non è un bug, si comporta proprio così, non lo faccio penso di aver bisogno di 'contentMode', ho bisogno di qualcosa di più potente –

22
- (UIImage *)image:(UIImage*)originalImage scaledToSize:(CGSize)size 
{ 
    //avoid redundant drawing 
    if (CGSizeEqualToSize(originalImage.size, size)) 
    { 
     return originalImage; 
    } 

    //create drawing context 
    UIGraphicsBeginImageContextWithOptions(size, NO, 0.0f); 

    //draw 
    [originalImage drawInRect:CGRectMake(0.0f, 0.0f, size.width, size.height)]; 

    //capture resultant image 
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    //return image 
    return image; 
} 
4

utilizzare la categoria qui sotto e poi applica bordo dal quarzo nella vostra immagine:

[yourimage.layer setBorderColor:[[UIColor whiteColor] CGColor]]; 
[yourimage.layer setBorderWidth:2]; 

La categoria: UIImage + AutoScaleResize.h

#import <Foundation/Foundation.h> 

@interface UIImage (AutoScaleResize) 

- (UIImage *)imageByScalingAndCroppingForSize:(CGSize)targetSize; 

@end 

UIImage + AutoScaleResize.m

#import "UIImage+AutoScaleResize.h" 

@implementation UIImage (AutoScaleResize) 

- (UIImage *)imageByScalingAndCroppingForSize:(CGSize)targetSize 
{ 
    UIImage *sourceImage = self; 
    UIImage *newImage = nil; 
    CGSize imageSize = sourceImage.size; 
    CGFloat width = imageSize.width; 
    CGFloat height = imageSize.height; 
    CGFloat targetWidth = targetSize.width; 
    CGFloat targetHeight = targetSize.height; 
    CGFloat scaleFactor = 0.0; 
    CGFloat scaledWidth = targetWidth; 
    CGFloat scaledHeight = targetHeight; 
    CGPoint thumbnailPoint = CGPointMake(0.0,0.0); 

    if (CGSizeEqualToSize(imageSize, targetSize) == NO) 
    { 
     CGFloat widthFactor = targetWidth/width; 
     CGFloat heightFactor = targetHeight/height; 

     if (widthFactor > heightFactor) 
     { 
      scaleFactor = widthFactor; // scale to fit height 
     } 
     else 
     { 
      scaleFactor = heightFactor; // scale to fit width 
     } 

     scaledWidth = width * scaleFactor; 
     scaledHeight = height * scaleFactor; 

     // center the image 
     if (widthFactor > heightFactor) 
     { 
      thumbnailPoint.y = (targetHeight - scaledHeight) * 0.5; 
     } 
     else 
     { 
      if (widthFactor < heightFactor) 
      { 
       thumbnailPoint.x = (targetWidth - scaledWidth) * 0.5; 
      } 
     } 
    } 

    UIGraphicsBeginImageContext(targetSize); // this will crop 

    CGRect thumbnailRect = CGRectZero; 
    thumbnailRect.origin = thumbnailPoint; 
    thumbnailRect.size.width = scaledWidth; 
    thumbnailRect.size.height = scaledHeight; 

    [sourceImage drawInRect:thumbnailRect]; 

    newImage = UIGraphicsGetImageFromCurrentImageContext(); 

    if(newImage == nil) 
    { 
     NSLog(@"could not scale image"); 
    } 

    //pop the context to get back to the default 
    UIGraphicsEndImageContext(); 

    return newImage; 
} 

@end 
6

Questo è l'equivalente Swift per la risposta di Rajneesh071, utilizzando le estensioni

UIImage { 
    func scaleToSize(aSize :CGSize) -> UIImage { 
    if (CGSizeEqualToSize(self.size, aSize)) { 
     return self 
    } 

    UIGraphicsBeginImageContextWithOptions(aSize, false, 0.0) 
    self.drawInRect(CGRectMake(0.0, 0.0, aSize.width, aSize.height)) 
    let image = UIGraphicsGetImageFromCurrentImageContext() 
    UIGraphicsEndImageContext() 
    return image 
    } 
} 

Usage:

let image = UIImage(named: "Icon") 
item.icon = image?.scaleToSize(CGSize(width: 30.0, height: 30.0)) 
+0

Questo ha funzionato per me! – thejuki

0
if([[SDWebImageManager sharedManager] diskImageExistsForURL:[NSURL URLWithString:@"URL STRING1"]]) 
    { 
     NSString *key = [[SDWebImageManager sharedManager] cacheKeyForURL:[NSURL URLWithString:@"URL STRING1"]]; 

     UIImage *tempImage=[self imageWithImage:[[SDImageCache sharedImageCache] imageFromDiskCacheForKey:key] scaledToWidth:cell.imgview.bounds.size.width]; 
     cell.imgview.image=tempImage; 

    } 
    else 
    { 
     [cell.imgview sd_setImageWithURL:[NSURL URLWithString:@"URL STRING1"] placeholderImage:nil completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) 
     { 
      UIImage *tempImage=[self imageWithImage:image scaledToWidth:cell.imgview.bounds.size.width]; 
      cell.imgview.image=tempImage; 
//    [tableView beginUpdates]; 
//    [tableView endUpdates]; 

     }]; 
    } 
Problemi correlati