单独识别UIImages

时间:2012-08-26 13:21:38

标签: objective-c ios xcode tags uiimage

我有一个应用程序,可以在视图中添加多个UIImages。然后可以在屏幕上拖动这些图像。如何检查已拖动的图像,然后将 图像的坐标保存到文件中,而不是同一视图中的其他UII图像。我需要一种标记每个UIImage的方法,如果可能的话将它们分开并分别识别它们。希望这是有道理的!

这就是我将每个UIImage添加到视图的方式:

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];

3 个答案:

答案 0 :(得分:2)

您可以在UIVIew上使用标记 property

正如官方doc中提到的那样:

  

标记可用于标识应用程序中视图对象的整数。

     

@property(非原子)NSInteger标记讨论默认值为0.您可以设置此标记的值,并稍后使用该值来标识视图。

答案 1 :(得分:1)

UIImageView是UIView的子类,因此具有tag属性。为每个图像设置该图像,然后当您希望该图像[self.subViews viewWithTag:number];找到它时。

编辑:如果我理解这一点,有很多UIImageViews,但多个imageViews可能会显示相同的图像。

假设您将标记的32位分区为16位作为唯一的imageView编号,而较低的16位是图像编号。然后,您需要遍历查找图像的所有子视图。您可以使用宏来简化这一过程:

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

当您想要查找显示该图像的所有图像视图时:

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"
}
}

答案 2 :(得分:1)

如果整数标记足够好,那么使用UIViews已经存在的tag属性。

但是,如果您想要更多内容,可以使用obj_setAssociatedObject向UIView添加tagName属性。

@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

然后可以这样使用......

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

以后......

NSString *imageName = imageView.tagName;

修改

当然,您可以添加任何内容,例如模仿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;
}