2

こんにちは私は多くのUIImageViewsを持っているsuperviewを持っています。私の場合は'View.m'であるSuperViewにUIPanGestureを追加しました。ユーザーがスーパービューでUIImageView(サブビュー)をドラッグしたときに、そのUIImageView(サブビュー)の参照またはオブジェクトを取得する必要があります。また、これが「hittest」で実行できる場合は、gestureHandlerで使用する方法を教えてください。 、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:を呼び出します。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 に答える