2

您好,我有超级视图,其中有许多 UIImageViews。我已将 UIPanGesture 添加到超级视图中,在我的情况下为“View.m”。当用户在superview中拖动它时,我需要获取该UIImageView(子视图)的引用或换句话说对象。如果这可以通过'hittest'完成,那么让我知道如何在gestureHandler中使用它并且作为hittest返回UIView ,我如何将 UiView 转换为 UIImageView。这是我的代码

//
//  View.m
//  PuzzleGame
//
//  Created by Noman Khan on 8/29/12.
//  Copyright (c) 2012 __MyCompanyName__. All rights reserved.
//

#import "View.h"
#define  noOfRows 5
#define  noOfCols 4
@implementation View
@synthesize imageArray;

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
    }

    return self;
}


// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.

- (void)initImageView {
    int x = 1;
    int y = 1;
//    int width = 190;
//    int height = 198;
    int width = sizeOfRows;
    int height = sizeOfCols;

    UIImageView *imgView=[[UIImageView alloc]initWithFrame:CGRectMake(x,y,width-10,height+5)]; 
    imgView.image=[UIImage imageNamed:@"iceage_01.png"];
    [self addSubview:imgView];

    x=x+(width-9);
    y=y+(sizeOfCols+9);

    UIImageView *imgView1=[[UIImageView alloc]initWithFrame:CGRectMake(x,y,width-10,height+5)]; 
    imgView1.image=[UIImage imageNamed:@"iceage_02.png"];
    [self addSubview:imgView1];





- (void)drawRect:(CGRect)rect
{
    imageArray=[[NSArray alloc]initWithObjects:[UIImage imageNamed:@"iceage_01.png"],[UIImage imageNamed:@"iceage_02.png"],[UIImage imageNamed:@"iceage_03.png"],[UIImage imageNamed:@"iceage_04.png"],[UIImage imageNamed:@"iceage_05.png"],[UIImage imageNamed:@"iceage_06.png"],[UIImage imageNamed:@"iceage_07.png"],[UIImage imageNamed:@"iceage_08.png"],[UIImage imageNamed:@"iceage_09.png"],[UIImage imageNamed:@"iceage_10.png"],[UIImage imageNamed:@"iceage_11.png"],[UIImage imageNamed:@"iceage_12.png"],[UIImage imageNamed:@"iceage_13.png"],[UIImage imageNamed:@"iceage_14.png"],[UIImage imageNamed:@"iceage_15.png"],[UIImage imageNamed:@"iceage_16.png"],[UIImage imageNamed:@"iceage_17.png"],[UIImage imageNamed:@"iceage_18.png"],[UIImage imageNamed:@"iceage_19.png"],[UIImage imageNamed:@"iceage_20.png"], nil];
    CGContextRef content=UIGraphicsGetCurrentContext();

    CGContextSetLineWidth(content, 2);
    CGContextSetStrokeColorWithColor(content, [UIColor whiteColor].CGColor);

    int totalWidth=self.frame.size.width;
    int totalHeight=self.frame.size.height;

     sizeOfRows=totalHeight/noOfRows;
     sizeOfCols=totalWidth/noOfCols;
    //making rows
    int x = 0,y = 0;

    for (int i=0; i<noOfRows+1; i++) {
        CGContextMoveToPoint(content, x, y);
        CGContextAddLineToPoint(content, 1000, y);
        CGContextStrokePath(content);
        //y=y+200;
        y=y+sizeOfRows;
    }
    //making colums
    x=0,y=0;
    for (int i=0; i<noOfCols+1; i++) {
        CGContextMoveToPoint(content, x, y);
        CGContextAddLineToPoint(content, x, 1000);
        CGContextStrokePath(content);
        //x=x+192;
        x=x+sizeOfCols;
    }

    [self initImageView];

    UIPanGestureRecognizer *panGesture=[[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(panHandler:)];
    [self addGestureRecognizer:panGesture];
    //    CGContextMoveToPoint(content, 20, 20);
    //    CGåContextAddLineToPoint(content, 50, 50);
    //    
    //    CGContextStrokePath(content);
}



- (void)panHandler:(UIGestureRecognizer *)sender{

    CGPoint point=[sender locationInView:self];

    if (sender.state == UIGestureRecognizerStateBegan) {
        NSLog(@"BEgin");
        UIView *v=[[UIView alloc]initWithFrame:CGRectMake(75, 75, 100, 100)];
     v   = [self hitTest:point withEvent:nil];
      //  UIImageView *imv=(UIImageView*)v;   
        [self addSubview:v];
    }
    if (sender.state == UIGestureRecognizerStateChanged) {
        NSLog(@"moved");
    }
    if (sender.state == UIGestureRecognizerStateEnded) {
        NSLog(@"end");
    }
   // NSLog(@"In Pan Handler");

}

@end
4

1 回答 1

2

是的,您可以使用 hittest。Hittest 以递归方式工作,以下是关于 hittest 的一些要点。1.它调用pointInside:withEvent: of self 2.如果它,hitTest:withEvent:,返回nil。您的视图层次结构已结束。你没有进一步的看法。3.如果返回YES,则将消息传递给子视图,从顶层子视图开始,一直到其他视图,直到某个子视图返回非nil对象或所有子视图都收到该消息。4.如果没有nil对象返回nil,则返回self

UIImageView 是 UIView 的子类,因此您可以将最热门的返回视图转换为 UIImageView:
UIImageView *imageView = (UIImageView *)[[UIView alloc]initWithFrame:CGRectMake(75, 75, 100, 100)];

您可以使用视图的 Tag 属性进行更好的处理。

于 2012-08-30T11:38:06.153 回答