constraint animations animate ios swift animation uiview uiviewanimation

ios - animations - ¿Cómo rotar la imagen en swift?



ui animation swift 3 (9)

No puedo rotar la imagen 90 grados rápidamente. He escrito el código de abajo, pero hay un error y no compila

func imageRotatedByDegrees(oldImage: UIImage, deg degrees: CGFloat) -> UIImage { //Calculate the size of the rotated view''s containing box for our drawing space let rotatedViewBox: UIView = UIView(frame: CGRect(x: 0, y: 0, width: oldImage.size.width, height: oldImage.size.height)) let t: CGAffineTransform = CGAffineTransform(rotationAngle: degrees * CGFloat(M_PI / 180)) rotatedViewBox.transform = t let rotatedSize: CGSize = rotatedViewBox.frame.size //Create the bitmap context UIGraphicsBeginImageContext(rotatedSize) let bitmap: CGContext = UIGraphicsGetCurrentContext()! //Move the origin to the middle of the image so we will rotate and scale around the center. bitmap.translateBy(x: rotatedSize.width / 2, y: rotatedSize.height / 2) //Rotate the image context bitmap.rotate(by: (degrees * CGFloat(M_PI / 180))) //Now, draw the rotated/scaled image into the context bitmap.scaleBy(x: 1.0, y: -1.0) bitmap.draw(oldImage, in: CGRect(origin: (x: -oldImage.size.width / 2, y: -oldImage.size.height / 2, width: oldImage.size.width, height: oldImage.size.height), size: oldImage.cgImage)) let newImage: UIImage = UIGraphicsGetImageFromCurrentImageContext()! UIGraphicsEndImageContext() return newImage }

debajo está el código del que no estoy seguro

bitmap.draw(oldImage, in: CGRect(origin: (x: -oldImage.size.width / 2, y: -oldImage.size.height / 2, width: oldImage.size.width, height: oldImage.size.height), size: oldImage.cgImage))


En Swift 4.1 y Xcode 9.4.1

dropDownImageView.transform = dropDownImageView.transform.rotated(by: CGFloat(Double.pi / 2))

Si quieres añadir animación ...

UIView.animate(withDuration: 2.0, animations: { self.dropDownImageView.transform = self.dropDownImageView.transform.rotated(by: CGFloat(Double.pi / 2)) })


En una línea:

extension UIImage { func fixImageOrientation() -> UIImage? { var flip:Bool = false //used to see if the image is mirrored var isRotatedBy90:Bool = false // used to check whether aspect ratio is to be changed or not var transform = CGAffineTransform.identity //check current orientation of original image switch self.imageOrientation { case .down, .downMirrored: transform = transform.rotated(by: CGFloat(M_PI)); case .left, .leftMirrored: transform = transform.rotated(by: CGFloat(M_PI_2)); isRotatedBy90 = true case .right, .rightMirrored: transform = transform.rotated(by: CGFloat(-M_PI_2)); isRotatedBy90 = true case .up, .upMirrored: break } switch self.imageOrientation { case .upMirrored, .downMirrored: transform = transform.translatedBy(x: self.size.width, y: 0) flip = true case .leftMirrored, .rightMirrored: transform = transform.translatedBy(x: self.size.height, y: 0) flip = true default: break; } // calculate the size of the rotated view''s containing box for our drawing space let rotatedViewBox = UIView(frame: CGRect(origin: CGPoint(x:0, y:0), size: size)) rotatedViewBox.transform = transform let rotatedSize = rotatedViewBox.frame.size // Create the bitmap context UIGraphicsBeginImageContext(rotatedSize) let bitmap = UIGraphicsGetCurrentContext() // Move the origin to the middle of the image so we will rotate and scale around the center. bitmap!.translateBy(x: rotatedSize.width / 2.0, y: rotatedSize.height / 2.0); // Now, draw the rotated/scaled image into the context var yFlip: CGFloat if(flip){ yFlip = CGFloat(-1.0) } else { yFlip = CGFloat(1.0) } bitmap!.scaleBy(x: yFlip, y: -1.0) //check if we have to fix the aspect ratio if isRotatedBy90 { bitmap?.draw(self.cgImage!, in: CGRect(x: -size.width / 2, y: -size.height / 2, width: size.height,height: size.width)) } else { bitmap?.draw(self.cgImage!, in: CGRect(x: -size.width / 2, y: -size.height / 2, width: size.width,height: size.height)) } let fixedImage = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return fixedImage }


Esta es una extensión de UIImage que se enfoca en Swift 4.0 y puede rotar solo la imagen sin la necesidad de un UIImageView . Se comprobó con éxito que la imagen se había girado y no solo se habían cambiado los datos exif

import UIKit extension UIImage { func rotate(radians: CGFloat) -> UIImage { let rotatedSize = CGRect(origin: .zero, size: size) .applying(CGAffineTransform(rotationAngle: CGFloat(radians))) .integral.size UIGraphicsBeginImageContext(rotatedSize) if let context = UIGraphicsGetCurrentContext() { let origin = CGPoint(x: rotatedSize.width / 2.0, y: rotatedSize.height / 2.0) context.translateBy(x: origin.x, y: origin.y) context.rotate(by: radians) draw(in: CGRect(x: -origin.x, y: -origin.y, width: size.width, height: size.height)) let rotatedImage = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return rotatedImage ?? self } return self } }

Para realizar una rotación de 180 grados, puedes llamarlo así:

let rotatedImage = image.rotate(radians: .pi)

Si por alguna razón no gira, la imagen original será devuelta.


Primero puede configurar su imagen en imageView y rotar obtener su imagen en imageView

Aquí:

let customImageView = UIImageView() customImageView.frame = CGRect.init(x: 0, y: 0, w: 250, h: 250) customImageView.image = UIImage(named: "yourImage") customImageView .transform = customImageView .transform.rotated(by: CGFloat.init(M_PI_2)) var rotatedImage = UIImage() rotatedImage = customImageView.image!


Puedes usar el siguiente código para Swift 3:

rotatedViewBox.transform = CGAffineTransform(rotationAngle: CGFloat.pi/2)


Su código no está tan lejos de ser funcional. Puede aplicar la transformación como lo está haciendo directamente al mapa de bits, no necesita una vista intermedia:

func imageRotatedByDegrees(oldImage: UIImage, deg degrees: CGFloat) -> UIImage { let size = oldImage.size UIGraphicsBeginImageContext(size) let bitmap: CGContext = UIGraphicsGetCurrentContext()! //Move the origin to the middle of the image so we will rotate and scale around the center. bitmap.translateBy(x: size.width / 2, y: size.height / 2) //Rotate the image context bitmap.rotate(by: (degrees * CGFloat(M_PI / 180))) //Now, draw the rotated/scaled image into the context bitmap.scaleBy(x: 1.0, y: -1.0) let origin = CGPoint(x: -size.width / 2, y: -size.width / 2) bitmap.draw(oldImage.cgImage!, in: CGRect(origin: origin, size: size)) let newImage: UIImage = UIGraphicsGetImageFromCurrentImageContext()! UIGraphicsEndImageContext() return newImage }

Además, si va a crear una función que gire una imagen, normalmente es una buena forma incluir un parámetro a la clockwise: Bool que interpretará el argumento de los degrees como girando en el sentido de las agujas del reloj o no. La implementación y conversión apropiada a radianes os dejo.

También tenga en cuenta que es un poco ondulado a mano por mi parte suponer que oldImage.size no es cero. Si es así, ¡ UIGraphicsGetCurrentContext()! probablemente se estrellará. Debe validar el tamaño de oldImage y, si no es válido, simplemente devuelva oldImage .


Su problema es que utiliza un inicializador no existente para CGRect. Si desea utilizar CGRect (origen: tamaño :) , cree el origen correctamente, sin los parámetros de ancho y alto. O elimine el parámetro de tamaño y use CGRect (x: y: ancho: alto :) .

Solo reemplaza esta linea

bitmap.draw(oldImage, in: CGRect(origin: (x: -oldImage.size.width / 2, y: -oldImage.size.height / 2, width: oldImage.size.width, height: oldImage.size.height), size: oldImage.cgImage))

Con este:

let rect = CGRect(origin: CGPoint(x: -oldImage.size.width / 2, y: -oldImage.size.height / 2), size: oldImage.size) bitmap.draw(oldImage.cgImage!, in: rect)


establecer imagen de ImageView

ImageView.transform = ImageView.transform.rotated(by: CGFloat(M_PI_2))


let angle = CGFloat(M_PI_2) let tr = CGAffineTransform.identity.rotated(by: angle) ImageView.transform = tr