2011-01-17 12 views
27

Modifico la propiedad contentMode de UIImageView. Así que el marco de mi imagen no es igual al marco de UIImageView. Mi problema es cómo recuperar el marco de la imagen desde UIImageView.¿Cómo obtener el marco de imagen mostrado desde UIImageView?

Como en el siguiente ejemplo, el rectángulo naranja es el borde del UIImageView. Obviamente, el marco de la imagen no es lo mismo que UIImageView.

Figure 1

Respuesta

33

Si se trata de UIViewContentModeScaleAspectFit, es algo como esto:

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

Así, UIImageView tiene ningún método directo para recuperar el marco de imagen. Necesita ser calculado manualmente, ¿verdad? – AechoLiu

+0

Sí. De hecho, ni siquiera parece tener un método privado que devuelva el marco de la imagen basado en 'contentMode'. Supongo que los cálculos se realizan en '-drawRect:' y '-sizeThatFits:'. – Costique

+0

Probé sizeThatFits :, no puede recuperar el marco de la imagen. Cambié la implementación sobre UIImageView. Si tengo que calcular el cuadro de imagen por mí mismo, preferiré el modo de contenido UIViewContentModeScaleToFill. – AechoLiu

17

De hecho, se ha incorporado desde el IOS 4 (por UIViewContentModeScaleAspectFit):

@import AVFoundation; 

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

Desde componentes del bastidor puede ser no números redondos, considere envolver la llamada por

CGRectIntegral(…) 

Ver http://nshipster.com/image-resizing/ para más trucos.

+1

Gracias por esta información. – 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) 
} 

Para probar si la función es correcto o no, he utilizado otra vista identificación de la frontera de la imagen en UIImageView.

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

    imageView.addSubview(frameIdentifyBorderView) 

enter image description here

perfecto!

3

utilizar esta API de AVFoundation
#import <AVFoundation/AVFoundation.h> CGRect imageRect = AVMakeRectWithAspectRatioInsideRect(imageView.image.size, imageView.bounds);

Cuestiones relacionadas