2011-02-04 12 views
8

¿Cómo puedo reducir las imágenes utilizadas en un UISegmentedControl? Estoy creando el control segmentado programáticamente:UISegmentedControl escala de imagen

UISegmentedControl * segmentButton; 
segmentButton = [UISegmentedControl segmentedControlWithItems: 
       [NSArray arrayWithObjects: 
        [UIImage imageNamed:@"option_one.png"], 
        [UIImage imageNamed:@"option_two.png"], 
        nil]]; 
segmentButton.contentMode = UIViewContentModeScaleToFill; 
segmentButton.frame = CGRectMake(10, 10, 200, 32); 
[view addSubview:segmentButton]; 

El resultado no es el esperado. Las imágenes .png originales tienen unos 100 píxeles de alto, y son no reducidas para ajustarse a la altura de 32 píxeles del control segmentado. Esto resulta en un control segmentado se dibujan con enormes imágenes superpuestas que:

screen shot

¿Cómo puedo saber el control de bajar esas imágenes?

Respuesta

19

Nunca use una imagen "grande" para mostrar solo un pequeño pictograma. La imagen completa se cargará en la memoria y solo se mostrará el 10% de sus píxeles, por lo que utilizará mucha memoria para nada.

Lo que puede hacer si realmente desea utilizar este recurso es crear una miniatura con el código anterior y usar esta nueva miniatura generada.

El siguiente método devuelve una nueva imagen que puede usar en su UISegmentedControl, y puede liberar la grande.

- (UIImage *)imageWithImage:(UIImage *)image scaledToSize:(CGSize)newSize { 
    UIGraphicsBeginImageContext(newSize); 
    [image drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)]; 
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();  
    UIGraphicsEndImageContext(); 
    return newImage; 
} 

Con su código:

UISegmentedControl * segmentButton; 
segmentButton = [UISegmentedControl segmentedControlWithItems: [NSArray arrayWithObjects: 
        [self imageWithImage:[UIImage imageNamed:@"option_one.png"] scaledToSize:CGSizeMake(32, 32)], 
        [self imageWithImage:[UIImage imageNamed:@"option_two.png"] scaledToSize:CGSizeMake(32, 32)], 
        nil]]; 
segmentButton.contentMode = UIViewContentModeScaleToFill; 
segmentButton.frame = CGRectMake(10, 10, 200, 32); 
[view addSubview:segmentButton]; 
+1

De acuerdo, si las imágenes son dinámicas, escalar, de lo contrario proporcionar diferentes tamaños en sus recursos de aplicaciones. – petert

+0

Tiene sentido. ¡Gracias! –

+1

segmentButton = [[[UISegmentedControl alloc] initWithItems: images] liberación automática]; – neoneye

1

En swift3,

extension UIImage { 
    func scaleImage(scaleToSize: CGSize) -> UIImage { 
     UIGraphicsBeginImageContext(scaleToSize) 

     self.draw(in: CGRect(origin: CGPoint(x: 0, y: 0), size: scaleToSize)) 
     let newImage = UIGraphicsGetImageFromCurrentImageContext() 

     UIGraphicsEndImageContext() 
     return newImage! 
    } 
} 
Cuestiones relacionadas