2011-07-17 15 views
8

¿cómo puedo obtener el factor de escala de un UIImageView cuyo modo es AspectFit?¿cómo puedo obtener el factor de escala de un UIImageView cuyo modo es AspectFit?

Es decir, tengo un UIImageView con modo AspectFit. La imagen (cuadrado) se escala a mi marco UIImageView que está bien.

Si deseo obtener la cantidad de escala que se usó (por ejemplo, 0.78 o lo que sea) ¿cómo puedo obtener esto directamente?

Yo no quiero decir que comparar una vista padre anchura a la anchura UIImageView como el cálculo tendría que tener en cuenta la orientación, teniendo en cuenta que estoy escalar una imagen cuadrada en una vista rectangular. De ahí que buscara una manera directa de consultar el UIImageView para averiguarlo.

EDITAR: Necesito que funcione también para el despliegue de iPhone o iPad.

+0

finalmente calcular el importe total cosas que necesito en lugar de usar UIImageView con el modo de contenido aspectFit. Es conveniente y es la pérdida de muchos detalles de información. – AechoLiu

Respuesta

16

He escrito una categoría UIImageView para ello:

UIImageView + ContentScale.h

#import <Foundation/Foundation.h> 

@interface UIImageView (UIImageView_ContentScale) 

-(CGFloat)contentScaleFactor; 

@end 

UIImageView + ContentScale.m

#import "UIImageView+ContentScale.h" 

@implementation UIImageView (UIImageView_ContentScale) 

-(CGFloat)contentScaleFactor 
{ 
    CGFloat widthScale = self.bounds.size.width/self.image.size.width; 
    CGFloat heightScale = self.bounds.size.height/self.image.size.height; 

    if (self.contentMode == UIViewContentModeScaleToFill) { 
     return (widthScale==heightScale) ? widthScale : NAN; 
    } 
    if (self.contentMode == UIViewContentModeScaleAspectFit) { 
     return MIN(widthScale, heightScale); 
    } 
    if (self.contentMode == UIViewContentModeScaleAspectFill) { 
     return MAX(widthScale, heightScale); 
    } 
    return 1.0; 

} 

@end 
+0

gracias - por cierto, "widthScale =" línea, por lo que uno debe usar "self.bounds.size" .width "y no" self.frame.size.width "then? – Greg

+1

@greg que no hace ninguna diferencia en la mayoría de los casos. Usé límites aquí porque es aproximadamente del tamaño de la vista en sí. Los límites especifican dónde la vista puede dibujar su contenido relativo a sí mismo, el marco especifica la posición relativa a su supervista. – Felix

+0

debería arreglar la división por situación cero – storoj

1

Bien se podría hacer algo como

CGFloat widthScale = imageView.image.size.width/imageView.frame.size.width; 
CGFloat heightScale = imageView.image.size.height/imageView.frame.size.height; 

Avísame si funciona para usted.

+0

gracias, pero yo buscaba solo el factor de escala general (notando que es un aspecto adecuado), y no quería tener que detectar la orientación para ver si el ajuste de aspecto se habría detenido primero en función de un ancho o una altura (si sé a qué me refiero) - estaba buscando para ver si hay una manera de obtener el valor sin mirar los tamaños de los marcos y detectar la orientación ... – Greg

Cuestiones relacionadas