2008-12-23 10 views
40

Das image.size Attribut von UIImageView gibt die Größe des ursprünglichen UIImage. Ich möchte die Größe des autoskalierten Bildes herausfinden, wenn es in die UIImageView (normalerweise kleiner als das Original) gelegt wird.Wie erhalten Sie die Größe eines skalierten UIImage in UIImageView?

Zum Beispiel habe ich das Bild auf Aspect Fit festgelegt. Jetzt möchte ich seine neue Höhe und Breite auf dem Bildschirm wissen, damit ich genau auf das neue skalierte Bild zeichnen kann.

Gibt es eine Möglichkeit, dies zu tun, ohne es selbst herauszufinden basierend auf der UIImageView Größe & UIImage Originalgröße (im Grunde Reverse Engineering seiner Skalierung)?

+0

Was ist die beste Lösung war? – Bryan

+0

habe das gleiche Problem, vielleicht muss ich die Größe selbst berechnen ... – negersiu

Antwort

0

Wie wäre es mit nur die UIImageView Größe aus seinem Rahmen? d.h. imageView.frame?

+0

image.frame.size ist die aktuelle Größe dieser Ansicht in seinem Superview-Koordinatensystem, das * wahrscheinlich * in Pixeln gemessen wird. – sirwart

0

Wenn der Rahmen unter Beibehaltung des Bildseitenverhältnisses gefüllt ist, entspricht der Bildbetrachtungsrahmen nicht der Bildgröße.

4

Da die Bildansicht auf Aspect Fit eingestellt ist, können Sie die Höhe und Breite der Bildansicht zusammen mit der Höhe und Breite des Originalbildes bestimmen und die Höhe und Breite des skalierten Bildes berechnen.

Das heißt, die besser Weg dies zu tun ist, um eine benutzerdefinierte Ansicht statt einer UIImageView haben. Zeichnen Sie das Bild anschließend in der benutzerdefinierten Ansicht. Auf diese Weise können Sie jeden Aspekt davon steuern. Siehe

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

Für weitere Informationen können Sie -:

+0

danke für das Sagen "der bessere Weg". Ich habe versucht, es so zu machen, dass ich es mit Aspect Fit auf dem Storyboard mache, aber es ist einfach so schmerzhaft, alles richtig zu machen, manuell zu machen ist in jeder Hinsicht viel besser. – 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

Das hat perfekt für mich funktioniert. Vielen Dank! –

+0

Wenn das übergebene Bild 0 heigh oder 0 width enthalten könnte, könnte das generierte CGRect NaN enthalten. Sei vorsichtig, wenn das passiert. –

+1

Diese Antwort hat mich einfach glücklich gemacht. Vielen Dank! :-D –

10

Diese einfache Funktion Größe des Bildes nach dem Aspekte fit berechnen wird:

-(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

Diese einfache Funktion der Größe des Bildes berechnen wird AV Foundation Functions Reference.

+3

das ist definitiv die beste Antwort! Ich war mir dieser Funktion nicht bewusst, vielen Dank;) – polo987

7

Eine Anpassung von cncool answer, in schnell wie eine UIImageView Erweiterung, vielleicht könnte es jemand nützlich sein:

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) 
    } 
} 
Verwandte Themen