2011-01-17 11 views
27

Modyfikuję właściwość contentMode UIImageView. Tak więc ramka mojego obrazu nie jest równa ramie UIImageView. Mój problem polega na tym, jak pobrać ramkę obrazu z UIImageView.Jak uzyskać wyświetlaną ramkę obrazu z UIImageView?

W poniższym przykładzie pomarańczowy prostokąt jest granicą UIImageView. Jest oczywiste, że ramka obrazu nie jest taka sama jak UIImageView.

Figure 1

Odpowiedz

33

Jeśli to UIViewContentModeScaleAspectFit, to coś takiego:

UIImageView *iv; // your image view 
CGSize imageSize = iv.image.size; 
CGFloat imageScale = fminf(CGRectGetWidth(iv.bounds)/imageSize.width, CGRectGetHeight(iv.bounds)/imageSize.height); 
CGSize scaledImageSize = CGSizeMake(imageSize.width*imageScale, imageSize.height*imageScale); 
CGRect imageFrame = CGRectMake(roundf(0.5f*(CGRectGetWidth(iv.bounds)-scaledImageSize.width)), roundf(0.5f*(CGRectGetHeight(iv.bounds)-scaledImageSize.height)), roundf(scaledImageSize.width), roundf(scaledImageSize.height)); 
+0

Więc UIImageView nie ma bezpośredniego sposobu, aby pobrać ramkę obrazu. Musi być obliczony ręcznie, prawda? – AechoLiu

+0

Tak. W rzeczywistości nawet nie wydaje się, że ma prywatną metodę, która zwraca ramkę obrazu w oparciu o 'contentMode'. Sądzę, że obliczenia są wykonywane w '-drawRect:' i '-sizeThatFits:'. – Costique

+0

Próbowałem sizeThatFits :, nie może pobrać ramki obrazu. Zmieniłem implementację o UIImageView. Jeśli muszę samodzielnie obliczyć imageFrame, wolę contentMode UIViewContentModeScaleToFill. – AechoLiu

17

W rzeczywistości, to wbudowane od iOS 4 (dla UIViewContentModeScaleAspectFit):

@import AVFoundation; 

AVMakeRectWithAspectRatioInsideRect(imageView.image.size, imageView.bounds); 

Od elementów ramowych może nie być okrągłymi cyframi, rozważ zawijanie połączenia przez:

CGRectIntegral(…) 

Aby uzyskać więcej wskazówek, patrz http://nshipster.com/image-resizing/.

+1

Dziękuję za te informacje. – AechoLiu

2
if you want to calculate it yourself, use below code written by me. 

func getImageFrameInImageView(imageView : UIImageView) -> CGRect { 
    /* 
    by 徐明刚, [email protected] 
    算法: 
     设高宽比 r = h/w, 则:r(imageView) 缩写成r(v), r(image)缩写为r(i), 
     if r(i) > r(v), 则 
     h(i) = h(v), 
     h(i)/w(i) = r(i) -> w(i) = h(i)/r(i) 
     y = 0 
     x = (w(v)/2) - (w(i)/2) 
    反之 
    */ 

    let image = imageView.image! 
    let wi = image.size.width 
    let hi = image.size.height 
    print("wi:\(wi), hi:\(hi)") 

    let wv = imageView.frame.width 
    let hv = imageView.frame.height 
    print("wv:\(wv), hv:\(hv)") 

    let ri = hi/wi 
    let rv = hv/wv 
    print("ri:\(ri), rv:\(rv)") 

    var x, y, w, h: CGFloat 

    if ri > rv { 
     h = hv 
     w = h/ri 
     x = (wv/2) - (w/2) 
     y = 0 
    } else { 
     w = wv 
     h = w * ri 
     x = 0 
     y = (hv/2) - (h/2) 
    } 

    return CGRect(x: x, y: y, width: w, height: h) 
} 

Aby sprawdzić, czy funkcja jest odpowiednia, skorzystałem z innego widoku, identyfikując obramowanie obrazu w UIImageView.

let frameIdentifyBorderView = UIView(frame: imageFrameInImageView) 
    frameIdentifyBorderView.layer.borderWidth = 3 
    frameIdentifyBorderView.layer.borderColor = UIColor.blueColor().CGColor 

    imageView.addSubview(frameIdentifyBorderView) 

enter image description here

doskonały!

3

Użyj tego api z AVFoundation
#import <AVFoundation/AVFoundation.h> CGRect imageRect = AVMakeRectWithAspectRatioInsideRect(imageView.image.size, imageView.bounds);

Powiązane problemy