你好我有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
答案 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属性来更好地处理。