2012-08-30 106 views
2

你好,我有superview,其中有很多UIImageViews.I已经添加UIPanGesture到SuperView这是'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 

回答

2

是的,你可以使用hittest。 Hittest以递归方式工作,下面是关于hittest的一些重要观点。 1.它调用pointInside:withEvent:自我 2.如果它,hitTest:withEvent :,返回nil。您的视图层次结束。你没有更多的意见。 3.如果返回YES,则将消息传递给子视图,它从顶级子视图开始,继续到其他视图,直到子视图返回非零对象或所有子视图接收消息。 4.如果没有无对象返回零,自返回

的UIImageView是的UIView的子类,所以你可以投你则hitTest返回视图的UIImageView:
的UIImageView *的ImageView =(UIImageView的*)[[UIView的页头] initWithFrame:CGRectMake(75,75,100,100)];

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

+0

K如果我正在使用手势处理函数,我会得到UIEvent的get对象吗? – Azerue

+0

您可以通过覆盖以下与UITouches相关的方法来获得UIEvent的对象。 - (void)touchesBegan:(NSSet *)与事件触发:(UIEvent *)事件; (void)touchesMoved:(NSSet *)与事件触发:(UIEvent *)事件; (void)touchesEnded:(NSSet *)触及事件:(UIEvent *)事件; (void)touchesCancelled:(NSSet *)与事件触发:(UIEvent *)事件并将此事件传递给hitTest。一个零也可以传递给hitTest – Ehsan

相关问题