Identificar UIImages individualmente

Tengo una aplicación donde se pueden agregar múltiples UIImages a la vista. Esas imágenes se pueden arrastrar por la pantalla. ¿Cómo puedo verificar qué imagen se ha arrastrado y luego guardar? que coordenadas de la imagen a un archivo y ninguna otra UIImage en la misma vista. Necesito una forma de etiquetar cada UIImage si es posible para separarlos e identificarlos individualmente. ¡Ojalá esto tenga sentido!

Así es como agrego cada UIImage a la vista:

CGRect imageFrame = CGRectMake(activeView.center.x - 50, activeView.center.y - 50, 200, 200);
imageResizableView = [[SPUserResizableView alloc] initWithFrame:imageFrame];
UIImage *image = [UIImage imageNamed:@"galaxy.jpg"];
UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
imageResizableView.contentView = imageView;
imageResizableView.delegate = self;
[activeView addSubview:imageResizableView];

preguntado el 26 de agosto de 12 a las 14:08

3 Respuestas

Puede utilizar el etiqueta property en UIView.

Según lo mencionado en el oficial doc:

etiqueta Un número entero que puede usar para identificar objetos de vista en su aplicación.

@property (no atómico) NSInteger tag Discusión El valor predeterminado es 0. Puede establecer el valor de esta etiqueta y utilizar ese valor para identificar la vista más adelante.

Respondido 26 ago 12, 14:08

Pero si establezco una etiqueta en imageView, la etiqueta de cada imagen se establecerá en esa etiqueta. Necesito una forma de establecer una etiqueta para cada UIImage individual, no para todos. - James Anderson

:-) Si accede a su imageView a través de un índice en una estructura, puede usar este índice como identificador: tiguero

¿Cómo haría yo para hacer esto? - James Anderson

¿Dónde almacena todas sus vistas de imágenes? debes tener una estructura de datos para eso, ¿no? - tiguero

¿Cómo quieres decir 'almacenado'? Simplemente los agrego a través de [activeView addSubview:imageResizableView]; a la vista - James Anderson

UIImageViews son subclases de UIView, así que tenga un tag propiedad. Configure eso para cada imagen, luego cuando quiera esa imagen [self.subViews viewWithTag:number]; para encontrarlo.

EDITAR: si entiendo esto, hay muchos UIImageViews, pero varios imageViews pueden mostrar la misma imagen.

Asumiendo eso, luego divide los 32 bits de la etiqueta para decir 16 bits superiores como el número único de vista de imagen, y los 16 inferiores son el número de imagen. Luego deberá iterar a través de todas las subvistas en busca de la imagen. Puedes usar macros para hacer esto más fácil:

#define TAG_NUMBER(imageViewNum, imageNum) ((imageViewNum << 16) | imageNum)
#define IMAGE_FROM_TAG(tag) (tag & 0xFFFF)
etc

cuando desee encontrar todas las vistas de imagen que muestren esa imagen:

for(UIVIew *view in self.subviews) {
if(![view isKindOf:[UIIMageView class]]) continue;

int imageNum = IMAGE_FROM(view.tag);
if(imageNum == theOneIwant) {
  save frame of "view"
}
}

Respondido 26 ago 12, 16:08

Pero si establezco una etiqueta en imageView, la etiqueta de cada imagen se establecerá en esa etiqueta. Necesito una forma de establecer una etiqueta para cada UIImage individual, no para todos. - James Anderson

Si las etiquetas de números enteros son lo suficientemente buenas, entonces use el tag propiedad que ya existe para UIViews.

Sin embargo, si quieres algo más, puedes usar obj_setAssociatedObject para agregar una propiedad tagName a UIView.

@interface UIView (tagName)
@property (nonatomic, copy) NSString *tagName;
@end

--

#import <objc/runtime.h>

@implementation UIView (tagName)
static char tagNameKey[1];

- (NSString*)tagName {
    return objc_getAssociatedObject(self, tagNameKey);
}

- (void)setTagName:(NSString *)tagName {
    objc_setAssociatedObject(self, tagNameKey, tagName, OBJC_ASSOCIATION_COPY_NONATOMIC);
}
@end

que luego se puede usar así...

NSString *imageName = @"galaxy.jpg";
UIImage *image = [UIImage imageNamed:imageName];
UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
imageView.tagName = imageName;

y después...

NSString *imageName = imageView.tagName;

EDITAR

Por supuesto, puedes agregar lo que quieras, por ejemplo para imitar viewWithTag

- (UIView*)viewWithTagName:(NSString *)tagName {
    if ([self.tagName isEqualToString:tagName]) {
        return self;
    }

    UIView *result = nil;
    for (UIView *view in self.subviews) {
        if ((result = [view viewWithTagName:tagName]) != nil) {
            return result;
        }
    }

    return nil;
}

Respondido 26 ago 12, 14:08

O simplemente haga una subclase de UIImageView con un identificador; mucho más fácil que los objetos asociados. - Jesse Rusak

Acordado. Dado que hay un costo de búsqueda de objetos asociados, se debe preferir el mecanismo de subclase. A menos que... quiera usar esto en el caso general de UIView, similar a la etiqueta de entero incorporada. Luego está el debate en curso sobre si las etiquetas son algo bueno... o los objetos asociados en general... o las categorías... o... - jody hagins

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.