0

我有一个应用程序,可以将多个 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];
4

3 回答 3

2

您可以在 UIVIew 上使用标签。 property

根据官方文档中提到的:

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

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

于 2012-08-26T13:29:24.030 回答
1

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"
}
}
于 2012-08-26T13:29:44.567 回答
1

如果整数标签足够好,则使用tagUIViews 已经存在的属性。

但是,如果您想要更多内容,可以使用obj_setAssociatedObject将 tagName 属性添加到 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

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

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;
}
于 2012-08-26T13:42:44.067 回答