Aisha
Aisha

Reputation: 1559

scrollview's subview does not get touch events when scroll view scrolls

I have a scrollView onto which some imageViews are added.
I want that when scrollView scrolls then also the imageViews should get touch events. But it is not happening in my case.

Only one of the two things happen at a time. Either the scrollView scrolls but the imageViews do not get touch events or the imageViews get touch events and the scrollView does not get scrolled.

Can't both of the things happen simultaneously. Please suggest.

Upvotes: 0

Views: 1902

Answers (5)

horseshoe7
horseshoe7

Reputation: 2837

I know this was posted a while ago, but...

By default, UIImageView objects have their property userInteractionEnabled set to NO. This could be why touches aren't registering. This has tripped me up on more than one occasion and it's one of those little things that only experience will help.

Set it to YES and see if that fixes it.

Upvotes: 1

Akshay
Akshay

Reputation: 2983

You can use "Tap Gesture Recognizer" to get the events on your images while it's being added to the scroll view. EDIT

You can refer to this code:

-(void)yourGestureRecognizer
{

UITapGestureRecognizer *yourTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
    [yourImageView addGestureRecognizer:yourGestureRecognizer];
    [yourGestureRecognizer release];
}

You can handle tap here:

-(void)handleTap:(UIGestureRecognizer *)sender{

    UIImageView *imageView = (UIImageView *)sender.view;

    switch (imageView.tag)
    {
        case 1: 
            m_pYourInstance=[[ViewController alloc]initWithNibName:@"ViewController" bundle:nil];
            [self.navigationController pushViewController:XXXXX animated:YES];
            break;
}

Hope this helps !!

Upvotes: 1

Eugene
Eugene

Reputation: 10045

Use UIButtons with background images set on them. Here's the loop you use to layout UIScrollView subviews:

for (int i = 0; i < [images count]; i++) {
  CGRect aFrame = ...;
  UIButton *button = [[[UIButton alloc] initWithFrame:aFrame] autorelease];
  [button setImage:[images objectAtIndex:i] forState:UIControlStateNormal];
  button.tag = i;
  [button addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside];
  [scrollView addSubview:button];
}

And here you process the touch event:

- (void)buttonClicked:(id)sender {
  UIButton *button = (UIButton *)sender;
  [self performActionWithImageAtIndex:[images objectAtIndex:button.tag]];
}

That will omit the need to create additional gesture recognizers and will lower the amount of boilerplate work.

-- edit

The other reason your UIImageViews are not detecting the touches is because you create them in code and forget to set userInteractionEnabled to YES.

Upvotes: 0

Maulik
Maulik

Reputation: 19418

yes you can do both. you need to customize your uiimageview by sub classing it and have to add Tap Gesture Recognizer like :

in .h file

@interface CustomView : UIImageView 
{
  // your variables
}

in .m file

//when you create an instants of your image view UITapGestureRecognizer will added in all your instants.
- (id)initWithFrame:(CGRect)frame 
{
    if ((self = [super initWithFrame:frame])) 
    {
        // add Gesture for tapping
        UITapGestureRecognizer* tap = [[UITapGestureRecognizer alloc] initWithTarget:self
                                                                    action:@selector(tap:)];
        tap.numberOfTapsRequired = 1;

        [self addGestureRecognizer:tap];
     }
return self;
}

then add delegate methods in .m file too

- (void) touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event
{
     UITouch *touch = [touches anyObject]; 
}

now in your custom cell, add your custom image view with Tap Gesture Recognizer

hope it will help you...

Upvotes: 0

Ilanchezhian
Ilanchezhian

Reputation: 17478

Use UIGestureRecognizer. Add the recognizer to your image views.

And if you are targeting some old iOS version, have a look at this link.

Upvotes: 0

Related Questions