简体   繁体   中英

Touch event in UIImageView

How can I determine what UIImageView I touch in the screen? Like for example, I added 10x10 tiled UIImageView in a UIView. Now in touchesBegan, how can I know the image I touch in screen? Should I use hitTest method in this implementation?

Thanks.

I generally find the easiest way is to subclass UIImageView and add my own touch event handlers.

In fact what I have often done is create one subclass of UIImageView who's sole purpose is to allow another class to act as next responder. That way I don't have to subclass it for every situation. That's only worth doing if you need a number of these views and you weren't subclassing them anyway.

this question was asked many times here. try to use search next time. I usually use UIButtons with custom style to do what you want. such a variant gives you standard methods to catch touches without subclassing.

To follow up on the UIButton suggestion, here's a snippet of what I have done for a UIButton that is rendered with a UIImage .

This was for tracking the specific UIButton image type that got touched within a UITableViewCell , and it passes along the row and section in which this UIButton was placed:

UIButton *_infoButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 30, 30)];
[_infoButton setImage:[UIImage imageNamed:@"Info.png"] forState:UIControlStateNormal];
[_infoButton setTitle:[NSString stringWithFormat:@"%d:%d", indexPath.section, indexPath.row] forState:UIControlStateReserved]; 
[_infoButton addTarget:self action:@selector(touchedDetailedInfoButton:) forControlEvents:UIControlEventTouchDown];
// ...
[ _infoButton release];

And here's the associated method for recovering the title and doing something interesting with it:

- (void) touchedDetailedInfoButton:(NSString *)title {
    unsigned int _section, _row;
    const char * _indexPathCharPtr = [title cStringUsingEncoding:NSUTF8StringEncoding];
    sscanf(_indexPathCharPtr, "%d:%d", &_section, &_row);
    NSUInteger _path[2] = {_section, _row};
    NSIndexPath *_touchedIndexPath = [[NSIndexPath alloc] initWithIndexes:_path length:2];
    [self doSomethingInterestingWithIndexPath:_touchedIndexPath];
    [_touchedIndexPath release];
}

There's probably an easier way to go about this, so hopefully someone else comes along and offers an alternative (other than subclassing UIImageView , which is a perfectly valid option, as well).

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM