ios - UIImageboardboard sin escala
swift uipasteboard (1)
Sé que esta es una publicación anterior, pero pensé que comparto el trabajo que encontré para este caso específico de copiar imágenes y pegarlas en aplicaciones de mensajería. El caso es que cuando envías una imagen con aplicaciones como iMessages, WhatsApp, Messenger, etc. , la forma en que muestran la imagen es para que su aspecto se ajuste a cierto ancho horizontal (digamos alrededor de 260 puntos para esta demostración).
Como puede ver en el siguiente diagrama, si envía 150x150 de imagen a 1x de resolución en imessage, se alargará y se mostrará en el cuadro de ancho requerido de 260, lo que hará que la imagen sea granulada.
Pero si agrega un margen de ancho 185 vacío a los lados izquierdo y derecho de la imagen, terminará con una imagen de tamaño 520x150. Ahora, si envía esa imagen de tamaño en imessage, tendrá que caber en un cuadro de ancho 260, terminando por llenar una imagen de 520x150 en una caja de 260x75, de una manera que le da una imagen de 75x75 a una resolución de 2x.
Puede agregar un margen de color claro a un UIImage con un código como este
extension UIImage {
func addMargin(withInsets inset: UIEdgeInsets) -> UIImage? {
let finalSize = CGSize(width: size.width + inset.left + inset.right, height: size.height + inset.top + inset.bottom)
let finalRect = CGRect(origin: CGPoint(x: 0, y: 0), size: finalSize)
UIGraphicsBeginImageContextWithOptions(finalSize, false, scale)
UIColor.clear.setFill()
UIGraphicsGetCurrentContext()?.fill(finalRect)
let pictureOrigin = CGPoint(x: inset.left, y: inset.top)
let pictureRect = CGRect(origin: pictureOrigin, size: size)
draw(in: pictureRect)
let finalImage = UIGraphicsGetImageFromCurrentImageContext()
defer { UIGraphicsEndImageContext() }
return finalImage
}
}
Estoy construyendo un teclado personalizado y tengo problemas para agregar una imagen al cartón y mantener la escala y la resolución apropiadas en la imagen pegada. Permítanme comenzar con una captura de pantalla del teclado para ilustrar mi problema:
Por lo tanto, la imagen de la cara en la parte superior izquierda del teclado es solo un UIButton con la foto original configurada en segundo plano. Cuando se presiona el botón, la imagen cambia de tamaño con la siguiente función:
func imageResize(image:UIImage, size:CGSize)-> UIImage {
let scale = UIScreen.mainScreen().scale
UIGraphicsBeginImageContextWithOptions(size, false, scale)
var context = UIGraphicsGetCurrentContext()
CGContextSetInterpolationQuality(context, kCGInterpolationHigh)
image.drawInRect(CGRect(origin: CGPointZero, size: size))
let scaledImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return scaledImage
}
Esta función crea un UIImage del mismo tamaño que el UIButton con la escala adecuada para reflejar la resolución de pantalla del dispositivo. Para verificar que la función es correcta, agregué un UIImageView lleno con la imagen escalada. La imagen escalada es la que se ve mal ubicada cerca del centro del teclado. Agregué el UIImageView con esta función:
func addImageToBottomRight(image: UIImage) {
var tempImgView = UIImageView(image: image)
self.view.addSubview(tempImgView)
tempImgView.frame.offset(dx: 100.0, dy: 50.0)
}
He intentado algunos métodos diferentes para agregar la imagen a la mesa de trabajo, pero todos parecen ignorar la escala de la imagen y mostrarla dos veces más grande en lugar de mostrarla con una resolución más alta:
let pb = UIPasteboard.generalPasteboard()!
var pngType = UIPasteboardTypeListImage[0] as! String
var jpegType = UIPasteboardTypeListImage[2] as! String
pb.image = image
pb.setData(UIImagePNGRepresentation(image), forPasteboardType: pngType)
pb.setData(UIImageJPEGRepresentation(image, 1.0), forPasteboardType: jpegType)
Los tres métodos no funcionan correctamente y producen el mismo resultado que se muestra en la captura de pantalla. ¿Alguien tiene alguna sugerencia de otros métodos? Para aclarar aún más mi objetivo, me gustaría que la imagen en el cuadro de texto del mensaje se vea idéntica a ambos UIImages en el teclado en términos de tamaño y resolución.
Aquí hay algunas propiedades del UIImage antes y cambie el tamaño en caso de que alguien tenga curiosidad:
Starting Image Size is (750.0, 750.0)
Size to scale to is: (78.0, 78.0))
Initial Scale: 1.0
Resized Image Size is (78.0, 78.0)
Resized Image Scale: 2.0