2011-08-29 13 views
11

Tengo un [UIButton buttonWithType:UIButtonTypeCustom] que tiene una imagen (o una imagen de fondo - el mismo problema) creada por [UIImage imageWithContentsOfFile:] apuntando a un archivo JPG tomado por la cámara y guardado en la carpeta de documentos por la aplicación.Problema de rotación de imagen UIButton

Si solo defino la imagen para UIControlStateNormal, cuando toco el botón, la imagen se oscurece como se esperaba, pero también gira 90 grados o 180 grados. Cuando retiro mi dedo, vuelve a la normalidad.

Esto no ocurre si uso la misma imagen para UIControlStateHighlighted, pero luego pierdo la indicación táctil (imagen más oscura).

Esto sólo ocurre con una imagen leída desde un archivo. No ocurre con [UIImage ImageNamed:].

traté de guardar el archivo en formato PNG en lugar de en formato JPG. En este caso, la imagen aparece en la orientación incorrecta para comenzar, y no se gira de nuevo cuando se toca. Esta no es una buena solución de todos modos porque el PNG es demasiado grande y lento de manejar.

¿Esto es un error o estoy haciendo algo mal?

+2

Tengo un problema similar en el que después de ajustar el fondo unbutton imagen a una imagen seleccionada de un uiimagepicker, la imagen aparece girada 90 grados ccw. – marciokoko

Respuesta

4

yo no era capaz de encontrar una solución adecuada a este y que necesitaba una solución rápida. A continuación se muestra una función que, dado un UIImage, devuelve una nueva imagen que se oscurece con un relleno alfa oscuro. Los comandos de relleno contextual podrían reemplazarse por otras rutinas de dibujar o rellenar para proporcionar diferentes tipos de oscurecimiento.

Ésta es sin optimizar y se hizo con un mínimo conocimiento de la API de gráficos.

Se puede utilizar esta función para ajustar la imagen del estado UIControlStateHighlighted para que al menos será más oscuro.

+ (UIImage *)darkenedImageWithImage:(UIImage *)sourceImage 
{ 
    UIImage * darkenedImage = nil; 

    if (sourceImage) 
    { 
     // drawing prep 
     CGImageRef source = sourceImage.CGImage; 
     CGRect drawRect = CGRectMake(0.f, 
            0.f, 
            sourceImage.size.width, 
            sourceImage.size.height); 
     CGContextRef context = CGBitmapContextCreate(NULL, 
                drawRect.size.width, 
                drawRect.size.height, 
                CGImageGetBitsPerComponent(source), 
                CGImageGetBytesPerRow(source), 
                CGImageGetColorSpace(source), 
                CGImageGetBitmapInfo(source) 
                ); 

     // draw given image and then darken fill it 
     CGContextDrawImage(context, drawRect, source); 
     CGContextSetBlendMode(context, kCGBlendModeOverlay); 
     CGContextSetRGBFillColor(context, 0.f, 0.f, 0.f, 0.5f); 
     CGContextFillRect(context, drawRect); 

     // get context result 
     CGImageRef darkened = CGBitmapContextCreateImage(context); 
     CGContextRelease(context); 

     // convert to UIImage and preserve original orientation 
     darkenedImage = [UIImage imageWithCGImage:darkened 
                 scale:1.f 
               orientation:sourceImage.imageOrientation]; 
     CGImageRelease(darkened); 
    } 

    return darkenedImage; 
} 
2

Para solucionar este problema, es necesario función de normalización adicional de la siguiente manera:

public extension UIImage { 

    func normalizedImage() -> UIImage! { 

     if self.imageOrientation == .Up { 
      return self 
     } 

     UIGraphicsBeginImageContextWithOptions(self.size, false, self.scale) 
     self.drawInRect(CGRectMake(0, 0, self.size.width, self.size.height)) 
     let normalized = UIGraphicsGetImageFromCurrentImageContext() 
     UIGraphicsEndImageContext() 

     return normalized 
    } 
} 

entonces usted puede utilizarlo como esa:

self.photoButton.sd_setImageWithURL(avatarURL, 
forState: .Normal, 
placeholderImage: UIImage(named: "user_avatar_placeholder")) { 

    [weak self] (image, error, cacheType, url) in 

    guard let strongSelf = self else { 

     return 
    } 

    strongSelf.photoButton.setImage(image.normalizedImage(), forState: .Normal 
} 
Cuestiones relacionadas