iphone objective-c ios cocoa-touch

iphone - Convierta puntos de la imagen a puntos UIImageView, contentMode-aware



uitextview swift 4 (4)

Digamos que tengo una imagen (por ejemplo, 1024 x 768 px) que se muestra en un UIImageView (por ejemplo, 300 x 300 px). Ahora, me gustaría convertir un punto de la imagen, por ejemplo, la posición de la nariz de una persona (x: 500, y: 600), al punto correspondiente en UIImageView con su modo de contenido tomado en cuenta.

Si contentMode se arregla en UIViewContentModeScaleToFill, la conversión será fácil. Pero si es UIViewContentModeScaleAspectFit, las cosas se vuelven más complejas.

¿Hay una manera elegante de lograr eso? Realmente no quiero calcular eso para cada modo de contenido único (más de 10, creo).

¡Gracias!


¿Por qué no puedes volver a escalar las coordenadas?

X (UIImageView) = (X (Imagen) / 1024) * 300

y

Y (UIImageView) = (Y (Imagen) / 768) * 300


Esa es mi solución rápida:

- (CGPoint)convertPoint:(CGPoint)sourcePoint fromContentSize:(CGSize)sourceSize { CGPoint targetPoint = sourcePoint; CGSize targetSize = self.bounds.size; CGFloat ratioX = targetSize.width / sourceSize.width; CGFloat ratioY = targetSize.height / sourceSize.height; if (self.contentMode == UIViewContentModeScaleToFill) { targetPoint.x *= ratioX; targetPoint.y *= ratioY; } else if(self.contentMode == UIViewContentModeScaleAspectFit) { CGFloat scale = MIN(ratioX, ratioY); targetPoint.x *= scale; targetPoint.y *= scale; targetPoint.x += (self.frame.size.width - sourceSize.width * scale) / 2.0f; targetPoint.y += (self.frame.size.height - sourceSize.height * scale) / 2.0f; } else if(self.contentMode == UIViewContentModeScaleAspectFill) { CGFloat scale = MAX(ratioX, ratioY); targetPoint.x *= scale; targetPoint.y *= scale; targetPoint.x += (self.frame.size.width - sourceSize.width * scale) / 2.0f; targetPoint.y += (self.frame.size.height - sourceSize.height * scale) / 2.0f; } return targetPoint; } - (CGRect)convertRect:(CGRect)sourceRect fromContentSize:(CGSize)sourceSize { CGRect targetRect = sourceRect; CGSize targetSize = self.bounds.size; CGFloat ratioX = targetSize.width / sourceSize.width; CGFloat ratioY = targetSize.height / sourceSize.height; if (self.contentMode == UIViewContentModeScaleToFill) { targetRect.origin.x *= ratioX; targetRect.origin.y *= ratioY; targetRect.size.width *= ratioX; targetRect.size.height *= ratioY; } else if(self.contentMode == UIViewContentModeScaleAspectFit) { CGFloat scale = MIN(ratioX, ratioY); targetRect.origin.x *= scale; targetRect.origin.y *= scale; targetRect.origin.x += (self.frame.size.width - sourceSize.width * scale) / 2.0f; targetRect.origin.y += (self.frame.size.height - sourceSize.height * scale) / 2.0f; targetRect.size.width *= scale; targetRect.size.height *= scale; } else if(self.contentMode == UIViewContentModeScaleAspectFill) { CGFloat scale = MAX(ratioX, ratioY); targetRect.origin.x *= scale; targetRect.origin.y *= scale; targetRect.origin.x += (self.frame.size.width - sourceSize.width * scale) / 2.0f; targetRect.origin.y += (self.frame.size.height - sourceSize.height * scale) / 2.0f; targetRect.size.width *= scale; targetRect.size.height *= scale; } return targetRect; }

Cuando esté refactorizado y optimizado, lo publicaré en github y publicaré el enlace aquí. Tal vez incluso ese fragmento de código podría ser útil para alguien.


Hoy, he tenido tiempo libre para armar mi solución a este problema y publicarlo en GitHub: UIImageView-GeometryConversion

Es una categoría en UIImageView que proporciona métodos para convertir puntos y rectas de la imagen para ver las coordenadas y respeta los 13 modos de contenido diferentes.

¡Espero que te guste!


No, no hay una forma integrada, pública o elegante de hacerlo.

Debe realizar ingeniería inversa de las funciones para los modos de contenido que necesita usted mismo.