2008-12-23 14 views
40

Atrybut image.size z UIImageView podaje rozmiar oryginalnego UIImage. Chciałbym dowiedzieć się, rozmiar autoskalowanego obrazu, gdy jest on umieszczony w UIImageView (zazwyczaj mniejszy niż oryginał). Na przykład mam obraz ustawiony na Aspect Fit. Teraz chcę poznać jego nową wysokość i szerokość na ekranie, dzięki czemu mogę dokładnie rysować na nowym skalowanym obrazie.Jak uzyskać rozmiar skalowanego UIImage w UIImageView?

Czy jest jakiś sposób, aby to zrobić, nie wymyślając samemu, bazując na rozmiarze oryginalnym UIImageView o rozmiarze UIImageView (w zasadzie odwrócić jego skalowanie)?

+0

co było najlepszym rozwiązaniem? – Bryan

+0

Mam ten sam problem, może będę musiał sam obliczyć rozmiar ... – negersiu

Odpowiedz

0

Co powiesz na pobranie rozmiaru UIImageView z ramki? to jest imageView.frame?

+0

image.frame.size to bieżący rozmiar tego widoku w układzie współrzędnych superview, który * prawdopodobnie * jest mierzony w pikselach. – sirwart

0

Jeśli ramka jest wypełniona z zachowaniem proporcji obrazu, ramka widoku obrazu nie będzie taka sama jak rozmiar obrazu.

4

Ponieważ widok obrazu jest ustawiony na Dopasowanie kształtu, można po prostu wziąć wysokość i szerokość widoku obrazu wraz z wysokością i szerokością oryginalnego obrazu oraz obliczyć wysokość i szerokość skalowanego obrazu.

To powiedziawszy, sposobem na zrobienie tego jest uzyskanie niestandardowego widoku zamiast UIImageView. Następnie narysuj obraz samodzielnie w widoku niestandardowym. W ten sposób możesz kontrolować każdy jego aspekt.

+0

dzięki za powiedzenie "lepsza droga". Starałem się nadrobić to scenariuszem z aspektem dopasowania, ale jest to tak bolesne, że próbuje wszystko w ten sposób, robiąc to ręcznie jest o wiele lepiej pod każdym względem. – Dal

79
-(CGRect)frameForImage:(UIImage*)image inImageViewAspectFit:(UIImageView*)imageView 
{ 
    float imageRatio = image.size.width/image.size.height; 

    float viewRatio = imageView.frame.size.width/imageView.frame.size.height; 

    if(imageRatio < viewRatio) 
    { 
     float scale = imageView.frame.size.height/image.size.height; 

     float width = scale * image.size.width; 

     float topLeftX = (imageView.frame.size.width - width) * 0.5; 

     return CGRectMake(topLeftX, 0, width, imageView.frame.size.height); 
    } 
    else 
    { 
     float scale = imageView.frame.size.width/image.size.width; 

     float height = scale * image.size.height; 

     float topLeftY = (imageView.frame.size.height - height) * 0.5; 

     return CGRectMake(0, topLeftY, imageView.frame.size.width, height); 
    } 
} 
+1

To działało idealnie dla mnie. Dzięki! –

+0

Jeśli przekazany obraz może współtworzyć 0 lub 0, wygenerowany CGRect może zawierać NaN. Zachowaj ostrożność, jeśli tak się stanie. –

+1

Ta odpowiedź po prostu mnie uszczęśliwiła. Dzięki! :-D –

10

Ta prosta funkcja obliczy rozmiar obrazu po kształtu pasowania:

-(CGSize)imageSizeAfterAspectFit:(UIImageView*)imgview{ 


    float newwidth; 
    float newheight; 

    UIImage *image=imgview.image; 

    if (image.size.height>=image.size.width){ 
     newheight=imgview.frame.size.height; 
     newwidth=(image.size.width/image.size.height)*newheight; 

     if(newwidth>imgview.frame.size.width){ 
      float diff=imgview.frame.size.width-newwidth; 
      newheight=newheight+diff/newheight*newheight; 
      newwidth=imgview.frame.size.width; 
     } 

    } 
    else{ 
     newwidth=imgview.frame.size.width; 
     newheight=(image.size.height/image.size.width)*newwidth; 

     if(newheight>imgview.frame.size.height){ 
      float diff=imgview.frame.size.height-newheight; 
      newwidth=newwidth+diff/newwidth*newwidth; 
      newheight=imgview.frame.size.height; 
     } 
    } 

    NSLog(@"image after aspect fit: width=%f height=%f",newwidth,newheight); 


    //adapt UIImageView size to image size 
    //imgview.frame=CGRectMake(imgview.frame.origin.x+(imgview.frame.size.width-newwidth)/2,imgview.frame.origin.y+(imgview.frame.size.height-newheight)/2,newwidth,newheight); 

    return CGSizeMake(newwidth, newheight); 

} 
11

Ta prosta funkcja obliczy wielkość obrazu: -

[imageView setFrame:AVMakeRectWithAspectRatioInsideRect(image.size, imageView.frame)]; 

Więcej szczegółów można zwrócić AV Foundation Functions Reference.

+3

to zdecydowanie najlepsza odpowiedź! Nie wiedziałem o tej funkcji, wielkie dzięki;) – polo987

7

Adaptacja cncool answer w Swift jako rozszerzenie UIImageView, być może to być przydatne dla kogoś:

extension UIImageView{ 
    func frameForImageInImageViewAspectFit() -> CGRect 
    { 
     if let img = self.image { 
      let imageRatio = img.size.width/img.size.height; 

      let viewRatio = self.frame.size.width/self.frame.size.height; 

      if(imageRatio < viewRatio) 
      { 
       let scale = self.frame.size.height/img.size.height; 

       let width = scale * img.size.width; 

       let topLeftX = (self.frame.size.width - width) * 0.5; 

       return CGRectMake(topLeftX, 0, width, self.frame.size.height); 
      } 
      else 
      { 
       let scale = self.frame.size.width/img.size.width; 

       let height = scale * img.size.height; 

       let topLeftY = (self.frame.size.height - height) * 0.5; 

       return CGRectMake(0, topLeftY, self.frame.size.width, height); 
      } 
     } 

     return CGRectMake(0, 0, 0, 0) 
    } 
}