【问题标题】:Identify UIImages Individually单独识别 UIImages
【发布时间】:2012-08-26 13:21:37
【问题描述】:

我有一个应用程序,可以将多个 UIImages 添加到视图中。然后可以在屏幕上拖动这些图像。如何检查哪个图像已被拖动,然后将 图像的坐标保存到一个文件中,并且在同一视图中没有其他 UIImage。如果可能的话,我需要一种标记每个 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];

【问题讨论】:

    标签: objective-c ios xcode tags uiimage


    【解决方案1】:

    您可以在 UIVIew 上使用 标签 property

    如官方doc所说:

    tag一个整数,可用于标识应用程序中的视图对象。

    @property(nonatomic) NSInteger 标记 讨论 默认值为0。您可以设置此标记的值,然后使用该值来识别视图。

    【讨论】:

    • 但是如果我在 imageView 上设置一个标签,每个图像的标签都会被设置为那个标签。我需要一种为每个单独的 UIImage 设置标签的方法,而不是全部。
    • :-) 如果您通过结构上的索引访问 imageView,则可以使用该索引作为标识符
    • 我该怎么做?
    • 在哪里存储所有的图像视图?你必须有一个数据结构吗?
    • “存储”是什么意思?我只是通过 [activeView addSubview:imageResizableView] 添加它们;到视图。
    【解决方案2】:

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

    【讨论】:

    • 但是如果我在 imageView 上设置一个标签,每个图像的标签都会被设置为那个标签。我需要一种为每个单独的 UIImage 设置标签的方法,而不是全部。
    【解决方案3】:

    如果整数标签足够好,则使用 UIView 已经存在的 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;
    }
    

    【讨论】:

    • 或者只是创建一个带有标识符的 UIImageView 的子类;比关联对象容易得多。
    • 同意。由于关联对象存在查找成本,因此应首选子类机制。除非……你想在 UIView 的一般情况下使用这个,类似于内置的整数标签。然后是关于标签是否是一件好事的持续争论......或一般的关联对象......或类别......或......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-18
    • 1970-01-01
    • 2016-08-12
    • 1970-01-01
    • 1970-01-01
    • 2011-08-13
    相关资源
    最近更新 更多