2012-03-28 4 views
11

Sto sviluppando un'applicazione iOS 4.UIImageView, setClipsToBounds e come le mie immagini stanno perdendo la testa

sto usando questo codice su un UIImageView su un UITableViewCell:

cell.photo.contentMode = UIViewContentModeScaleAspectFill; 
[cell.photo setClipsToBounds:YES]; 

Le mie immagini sono più alte che larghe, e quando ho impostato UIViewContentModeScaleAspectFill, le immagini vengono adattate alla larghezza, con larghezza UIImageView. Facendo questo, l'immagine diventa più grande di UIImageView e la vedo fuori UIImageView.

Quindi, ho bisogno di usare setClipsToBounds:YES per non permettere questo, ma ora tutte le mie immagini perdono la testa.

C'è un modo per utilizzare UIViewContentModeScaleAspectFill e centrare l'angolo dell'immagine in alto a sinistra con l'angolo in alto a sinistra UIImageView? Se ho bisogno di perdere una parte dell'immagine, preferisco perdere i piedi che la testa.

UPDATE

sto usando sdWebImage quadro e ho usato Vadim Yelagin risposta e questo è il mio codice ora:

[cell.photo setImageWithURL:[NSURL URLWithString:entry.photo] 
       placeholderImage:[UIImage imageNamed:@"placeholder.png"] 
         success:^(UIImage *image) { 
          CGFloat scaleX = cell.photoBorder.bounds.size.width/image.size.width; 
          CGFloat scaleY = cell.photoBorder.bounds.size.height/image.size.height; 
          CGFloat scale = MAX(scaleX, scaleY); 
          cell.photo.frame = CGRectMake(0, 0, image.size.width * scale, image.size.height * scale); 
          cell.photo.image = image; 
         } 
         failure:nil]; 

devo aspettare per ottenere tutte le immagini caricate e ricaricare spostare UITableView per vedere l'immagine giusta sulla cella di destra (questo perché le immagini vengono memorizzate nella cache e carica più velocemente).

Utilizzare invece cell.photo.frame e cell.photo.image Devo passare al blocco indexPath.row per ottenere la cella di destra.

potrei aggiungere un nuovo metodo per UIImageView + WebCache:

- (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder success:(void (^)(UIImage *image, NSInteger row))success failure:(void (^)(NSError *error))failure; 
{ 
    [self setImageWithURL:url placeholderImage:placeholder options:0 success:success failure:failure]; 
} 

Ma se lo faccio, ottengo un errore qui:

[self setImageWithURL:url placeholderImage:placeholder options:0 success:success failure:failure]; 

Perché ora il successo non è di tipo (void (^)(UIImage *image))

Sai come posso risolvere questo problema?

risposta

0

Non c'è modo incorporato per fare questo, ma è possibile farlo manualmente:

UIGraphicsBeginImageContext(CGSizeMake(desiredWidth, desiredHeight)); 

[originalImage drawAtPoint...]; 
... 

UIImage *scaledImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 
+0

Grazie, ma non capisco il tuo codice, mi dispiace. – VansFannel

+0

Si crea un contesto immagine usando 'UIGraphicsBeginImageContext' e quindi si disegna l'immagine originale ingrandita in modo da riempire l'intero contesto ma la parte in alto a sinistra dell'immagine è a (0 | 0). –

2

AFAIK, il modo più semplice è quello di calcolare la cornice della ImageView manualmente dalla dimensione dell'immagine e la cornice

Creare una vista con la cornice che si sta specificando per la propria imageView, rendere viewView come sua subview. Impostare view.clipsToBounds = YES.

Poi, quando si assegna un'immagine, fare qualcosa di simile

CGFloat scaleX = view.bounds.size.width/image.size.width; 
CGFloat scaleY = view.bounds.size.height/image.size.height; 
CGFloat scale = MAX(scaleX, scaleY); 
imageView.frame = CGRectMake(0, 0, image.size.width * scale, image.size.height * scale); 
imageView.image = image; 
+1

Grazie.La tua soluzione funziona ma sto usando il framework sdwebimage e le mie immagini vengono caricate in modo asincrono e fanno parte di UITableViewCells, quindi dovrò modificare il tuo codice per farlo funzionare. Ho intenzione di aggiornare la mia domanda con la tua risposta e scrivere il mio nuovo problema. – VansFannel

+0

Si può provare (valore-chiave) osservando la proprietà 'image' di imageView e regolare la cornice nel proprio codice osservatore. O sottoclassi UIImageView e sovrascrivi il suo 'setImage:'. –

+0

Ho provato a creare una sottoclasse, ma ho un altro problema. Ho aggiornato la mia domanda con questo nuovo problema. – VansFannel