0
votes

I'm trying to connect a gesture to a UIView so I can tap on the object, but it is not working. What am I doing wrong?

Shape.h

#import <UIKit/UIKit.h>

@interface Shape : UIView; 

- (id) initWithX: (int)xVal andY: (int)yVal;

@end

Shape.m

#import "Shape.h"

@implementation Shape 

- (id) initWithX:(int )xVal andY:(int)yVal {
    self = [super init];    
    UIView *shape = [[UIView alloc] initWithFrame:CGRectMake(xVal, yVal, 10, 10)];
    shape.backgroundColor = [UIColor redColor];
    shape.userInteractionEnabled = YES;     
    [self addSubview:shape];
    return self;
}

@end

MODIFIED CODE: The following code is in the main ViewController. I have removed the UITapGestureRecognizer from the Shape class. The code works if I make the following change, but then it is 'box' that responds to the tap gesture, not 'shape': [shape addGestureRecognizer:tap]; to [box addGestureRecognizer:tap];

- (void)handlerTap:(UITapGestureRecognizer *)recognizer {
    //CGPoint location = [recognizer locationInView:[recognizer.view superview]];
    NSLog(@"Success");
}
-(void)drawShapes{
    NSLog(@"Draw");
    if(!box){
        box = [[UIView alloc] initWithFrame:CGRectMake(0, 0, screenWidth, screenHeight-100)];
        box.backgroundColor = [UIColor colorWithRed: 0.8 green: 0.8 blue: 0.0 alpha:0.2];
        [self.view addSubview:box];
    }
    for (int i = 0; i<5; i++) {
        int x = arc4random() % screenWidth;
        int y = arc4random() % screenHeight;
        Shape * shape =[[Shape alloc] initWithX:x andY:y ];
        [box addSubview:shape];
        UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] init];
        [tap setNumberOfTapsRequired:1];
        [tap addTarget:self action:@selector(handlerTap:)];
        [box addGestureRecognizer:tap];     
    }
}

SOLUTION: I have learned that self = [super init]; needs to be changed to include a CGRECT that defines the boundaries of the view that *shape is placed into. self = [super initWithFrame:CGRectMake(xVal, yVal, 10, 10)];

Also, *shape needs to be placed at 0,0 to ensure its correct placement within its parent. UIView *shape = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];

#import "Shape.h"

@implementation Shape 

- (id) initWithX:(int )xVal andY:(int)yVal {
    self = [super initWithFrame:CGRectMake(xVal, yVal, 10, 10)];    
    UIView *shape = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
    shape.backgroundColor = [UIColor redColor];
    shape.userInteractionEnabled = YES;     
    [self addSubview:shape];
    return self;
}
@end
1
you're not setting shape's frame anywhere!Moxy

1 Answers

2
votes

You should set the target of the gesture recognizer to self, not the view, because you implemented the handlerTap: method in the Shape class.