在superview中查找子视图的位置

时间:2012-08-30 10:56:52

标签: objective-c ios

你好我有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

1 个答案:

答案 0 :(得分:2)

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

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

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