2012-03-28 17 views
11

Pracuję nad aplikacją iOS 4.UIImageView, setClipsToBounds i jak moje obrazy tracą głowę

Używam tego kodu w UIImageView na UITableViewCell:

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

Moje obrazy są wyższe niż szersze, a kiedy ustawić UIViewContentModeScaleAspectFill, zdjęcia są skalowane w celu dopasowania szerokości o szerokości UIImageView. Robiąc to, obraz staje się większy niż UIImageView i widzę go poza UIImageView.

Następnie muszę użyć setClipsToBounds:YES, aby nie dopuścić, ale teraz wszystkie moje obrazy tracą głowę.

Czy istnieje sposób użycia UIViewContentModeScaleAspectFill i wyśrodkowania lewego górnego rogu obrazu z lewym górnym rogiem rogu UIImageView? Jeśli potrzebuję stracić część obrazu, wolę stracić stopy niż głowę.

UPDATE

Używam sdWebImage ramy i użyłem Vadim Yelagin odpowiedź i to jest mój kod teraz:

[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]; 

muszę czekać, aby uzyskać wszystkie obrazy i załadowany załaduj ponownie wokół UITableView, aby zobaczyć właściwy obraz w prawej komórce (dzieje się tak, ponieważ obrazy są buforowane i ładuje się szybciej).

Zamiast używać cell.photo.frame i cell.photo.image muszę przejść do bloku indexPath.row, aby uzyskać właściwą komórkę.

mogę dodać nową metodę do 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]; 
} 

Ale jeśli to zrobię, otrzymuję komunikat o błędzie tutaj:

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

Bo teraz sukces nie jest typu (void (^)(UIImage *image))

Czy wiesz, jak mogę rozwiązać ten problem?

Odpowiedz

0

Nie ma wbudowanego sposób to zrobić, ale można to zrobić ręcznie:

UIGraphicsBeginImageContext(CGSizeMake(desiredWidth, desiredHeight)); 

[originalImage drawAtPoint...]; 
... 

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

Dzięki, ale nie rozumiem swój kod, przepraszam. – VansFannel

+0

Utworzono kontekst obrazu za pomocą "UIGraphicsBeginImageContext", a następnie narysowano oryginalny obraz powiększony tak, aby wypełniał cały kontekst, ale lewy górny róg obrazu znajduje się na (0 | 0). –

2

AFAIK, najprostszym sposobem jest obliczenie ramka ImageView jest ręcznie od wielkości obrazu i ramy chcesz, żeby to pasowało.

Utwórz widok z ramką, którą aktualnie określasz dla swojego imageView, zrób zdjęcie Wyświetl jego podgląd. Ustaw view.clipsToBounds = YES.

Wtedy, kiedy przypisać obraz, zrobić coś podobnego

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

Dziękuję.Twoje rozwiązanie działa, ale używam sdwebimage framework, a moje obrazy ładują się asynchronicznie i są częścią UITableViewCells, więc będę musiał dostosować kod, aby działał. Zamienię moje pytanie na twoją odpowiedź i zapiszę mój nowy problem. – VansFannel

+0

Możesz spróbować (wartość klucz-wartość) obserwując właściwość 'image' obrazu i dopasować ramkę do kodu obserwatora. Lub podklasę UIImageView i nadpisaj jej 'setImage:'. –

+0

Próbowałem podklasy, ale mam inny problem. Zaktualizowałem moje pytanie o ten nowy problem. – VansFannel

Powiązane problemy