2012-08-30 2 views
2

Bonjour, j'ai superview dans lequel j'ai beaucoup de UIImageViews.J'ai ajouté UIPanGesture à la SuperView qui est 'View.m' dans mon cas. J'ai besoin d'obtenir la référence ou dans d'autres mots l'objet de cette UIImageView (subview) quand l'utilisateur le fait glisser dans superview.Also si cela peut être fait avec 'hittest' alors laissez-moi savoir comment l'utiliser dans gestureHandler et comme le plus fort renvoie UIView , comment je peux convertir UiView en UIImageView. Voici mon codetrouver des emplacements de sous-vue dans superview

// 
// 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 

Répondre

2

Oui, vous pouvez utiliser hittest. Hittest fonctionne de façon récursive, voici quelques points importants sur le plus hittest. 1. Il appelle pointInside: withEvent: de soi 2. Si c'est le cas, hitTest: withEvent :, renvoie zéro. votre hiérarchie de vue est la fin. vous n'avez pas d'autres vues. 3. Si elle renvoie YES, le message est transmis aux sous-vues, il commence à partir de la sous-vue de niveau supérieur et continue jusqu'aux autres vues jusqu'à ce qu'un sous-affichage renvoie un objet non nul ou toutes les sous-vues reçoivent le message. 4. Si aucun objet nul est retourné nul, l'auto est retourné

UIImageView est la sous-classe UIView de sorte que vous pouvez lancer votre hittest retourné en vue de UIImageView:
UIImageView * imageView = (UIImageView *) [[UIView alloc ] initWithFrame: CGRectMake (75, 75, 100, 100)];

Vous pouvez utiliser la propriété d'affichage Tag pour une meilleure gestion.

+0

K Et puis-je obtenir l'objet get de UIEvent car le plus hittest nécessite un objet le plus fort si j'utilise le gestionnaire de gestes. – Azerue

+0

vous pouvez obtenir l'objet de UIEvent en remplaçant les méthodes suivantes liées à UITouches. - (void) touchesBegan: (NSSet *) touche l'événementEvent: (UIEvent *); - (void) touchesMoved: (NSSet *) touche l'événement Event: (UIEvent *); - (void) touchesEnded: (NSSet *) touche l'événementEvent: (UIEvent *); - (void) touchesCancelled: (NSSet *) touche l'événementEvent: (UIEvent *) et transmet cet événement à hitTest. un nil peut également être passé à hitTest – Ehsan

Questions connexes