Making an area of a UIImage/UIScrollView "clickable"
So I have two issues to solve:
- Detect a click on an area in an UIImageView.
- Detect a click on an area in an UIScrollView.
I'm thinking for both, since I have the x/y coordinates from the client, I'm going to programmatically instantiate an UIButton (custom/transparent) and place it over the desired area for both the UIImageView & UIScrollViews.
I will also have an event that fires when the user selects the button. I'm thinking about providing a tag and using a signature like
- (IBAction) btnP开发者_StackOverflowress:(id)sender
So I can query the sender
[sender tag]
And then make decisions based on the tag. Each button will have a unique id. My questions are:
- Is this a good way to do it? What would be better?
- I'm aware of how to do all these things in IB, but not programmatically. I was under the impression connections (for IBActions) are only made in IB, so how can I wire up a button to an event all in code (I'll start googling now).
TIA.
If you want to use a UIButton to handle the touches, you can indeed create a custom button to place over the frame. If you take this route, to apply a method to the button, you must do the following:
UIButton *myButton = [UIButton buttonWithType:....];
myButton.tag = // your tag;
[myButton addTarget:self action:@selector(btnPress:) forControlEvents:UIControlEventTouchUpInside];
Then when you want to call the method, it will be an IBAction method as you would expect.
- (IBAction)btnPress:(id)sender {
where [sender tag]
will indeed get your specified button to proceed as you wish.
That being said, I might be more inclined to set up a UIGestureRecognizer on the views. Basically, you would tag your UIImageView and/or UIScrollView, then create a gesture recognizer:
UITapGestureRecognizer *myGesture = [[UITapGestureRecognizer alloc] init];
[myGesture addTarget:self action@selector(frameTouched:)];
// for the case of the imageView;
[myImageView addGestureRecognizer:myGesture];
[myGesture release];
Then to handle the gesture,
- (void)frameTouched:(UIGestureRecognizer *)gesture {
int myLogicTag = [[gesture view] tag]; // this finds the tag of the view it embodies, in this case your imageView
// continue with your code;
}
Of course, if you have custom scrollView or imageView classes, you can simply override the touchesBegan
method and do what you want from there. I think that should cover your options pretty well, so I hope this helps
精彩评论