确定点击的子视图



我有一个背景图像(imageView - tag 0),它已被几个标记的图像子视图填充(imgView - 标记为1 - ? 我在主背景图像中添加了一个点击识别器,并且还尝试了子视图。 我可以通过点击进入后台点击识别器例程,但无法识别已点击的子视图。

将点击识别器添加到背景(在视图加载期间):

UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTapGestureCaptured:)];
[imageView addGestureRecognizer:singleTap];
[imageView setUserInteractionEnabled:YES];
在加载每个子视图

时将点击识别器添加到每个子视图:

- (void) showPics{  // display previously stored pictures
    NSString *PictureName;
    NSNumber *x;
    NSNumber *y;
    UIImage *viewImage;
    tag = 1;  // NSInteger declared in .h - background tag is zero
    UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTapGestureCaptured:)];
    NSLog(@"reading from picFile: %@",self.picFile);
    if ([[NSFileManager defaultManager] fileExistsAtPath:self.picFile]){
        NSLog(@"FILE Found");
        NSMutableArray *picData;
        picData = [[NSMutableArray alloc] initWithContentsOfFile:self.picFile];
        int count = picData.count/3;
        NSLog(@"Count: %d",count);
        // set up picture path before cycling through array
        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *documentsDirectory = [paths objectAtIndex:0];
        // cycle to load pictures from file and place on background image 
        for(int i = 0; i < count; i++) {
            PictureName = [picData objectAtIndex:i * 3];
            NSString *showPic=[documentsDirectory stringByAppendingPathComponent:PictureName];
            if ([[NSFileManager defaultManager] fileExistsAtPath:showPic]){
                NSLog(@"Loading: %@",PictureName);
            }else{
                NSLog(@"Picture Does Not Exist");
            }
            x = [picData objectAtIndex:i * 3 + 1]; // x coord
            y = [picData objectAtIndex:i * 3 + 2]; // y coord
            viewImage = [UIImage imageWithContentsOfFile:showPic];
            // find center of displayed image and place picture there
            imgView = [[[UIImageView alloc] initWithFrame:CGRectMake([x floatValue] - 225,[y floatValue] - 172.5, 450, 345)] autorelease];
            [imgView setImage:viewImage];
            [imgView setContentMode:UIViewContentModeCenter];
            [imgView addGestureRecognizer:singleTap];    
            [imgView setUserInteractionEnabled:YES];
            imgView.tag = tag;
            [imageView addSubview:imgView];
            tag++;            
            NSLog(@"Tag: %d",tag);
        }
        [picData release];
    }else{
        NSLog(@"Did not find File");
    }
}

在任何地方点击调用的例程:

- (void)singleTapGestureCaptured:(UITapGestureRecognizer *)sender{
NSLog(@"singleTapGestureCaptured - SUBVIEWS: %d", [imageView.subviews count]);
NSLog(@"TAG: %d",sender.view.tag); 
}

这正确地给了我子视图的数量,但总是返回"TAG:0",除非我点击最后添加的子视图。 我需要知道的是访问点击的子视图的 TAG 的正确格式,以便我可以使其激活并移动它,或者有关如何执行此操作的任何其他建议。

不确定要这么说,但我想重点是你的tag变量不会改变。 如果 tag 变量对于整个 ".m" 文件不是全局的,则它无法将其值保存在不同的函数或方法中。尝试在".h"文件中声明它并为其指定一些其他名称(例如 Tag 或 tagValue),以便编译器可以不同它应该返回的内容(变量的标记或变量的标记),然后在每次将其分配给 int 时添加self.Tagself.tagValue(无论您如何命名)。祝你好运,让我知道它是否有效。

放置一个断点/NSLog imgView的标签值。代码片段不会告诉您tag变量 (tag++) 的范围。似乎它没有得到更新。

imgView.tag = tag;

请注意,singleTapGestureCaptured方法中的sender.view应始终为您提供最顶层的imgView(子视图),因为您要将TapGestureRecognizer添加到所有imgViews(子视图)。通常,当最顶层的子视图在这些情况下不添加(注册)任何手势时,该手势将按顺序传递给底层子视图/父视图,直到有人在视图堆栈中处理它。

编辑:(发布附加代码后)

您需要创建单独的 UITapGestureRecognizer 对象,并将它们添加到每个子视图中。但是,所有这些都可以使用相同的@selector方法。

因此,在for循环移动此行。

UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTapGestureCaptured:)];

就在上面

        [imgView addGestureRecognizer:singleTap];    
//I'm not fan of this but this worked for me
//you can create new imageView and pass tag of tapped subview
//for example some imageView that is subview of a view
//first:
UIImageView *imageView;
imageView.tag = 0;
UITapGestureRecognizer *itemTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(imageTap:)];
[imageView addGestureRecognizer:itemTap];
[someView addSubview:imageView];
//in the action selector imageTap:
-(void)imageTap:(id)sender{
if ([(UIGestureRecognizer *)sender view].tag == 0) {
UIImage *selectedImage;
selectedImage.frame = [[(UIGestureRecognizer *)sender view] viewWithTag:0].frame;
selectedImage.image = [UIImage imageNamed:@"newImage.png"];
//replace with the old:
[someView addSubview:selectedImage];
}}

GOODLUCK ;)

最新更新