开发者

UIGestureRecognizers for view in a scroll view

I'm using a few UIGestureRecognizers to pan, rotate and scale a v开发者_StackOverflow中文版iew, which resides inside a scroll view.

My problem is that sometimes the scroll view eats the touches before the gesture recognizers do, so when this happens I end up zooming the scroll view instead of dragging the view. (It doesn't happen all the time. I still can't describe how to reproduce this behavior).

I'm pretty sure this can be solved in some way. For example MPMoviePlayerController doesn't have this problem: in fact, you can put it in a scroll view, and when you pinch it, it works just fine (i.e. it doesn't zoom the outer scroll view too). Does anyone know how does MPMoviePlayerController achieve this?

I've already searched for answers on SO, with no results. Thanks!


Disclaimer: This is just an idea, I haven't tested this.

UIGestureRecognizerDelegate defines gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:. You could try implementing this on your gesture recognizer delegate. This won't prevent the scroll view from zooming. To prevent zooming you could try temporary setting maximumZoomScale minimumZoomScale to zoomScale in the recognizer action method.


At a guess your rotation is conflicting with zoom - both probably require two touches?

In which case try creating a one touch rotation.

Or disable zooming on the scrollview and implement zooming/scaling via pinch gesture recognizer.

see:

http://www.icodeblog.com/2010/10/14/working-with-uigesturerecognizers/


Could you not set scrollEnabled(NO) on your UIScrollView?

http://developer.apple.com/library/ios/#DOCUMENTATION/UIKit/Reference/UIScrollView_Class/Reference/UIScrollView.html

If the value of this property is YES , scrolling is enabled, and if it is NO , scrolling is disabled. The default is YES.

When scrolling is disabled, the scroll view does not accept touch events; it forwards them up the responder chain.

Things like zoomToRect:animated: don't say anything about being disabled by this flag; I'd assume that would keep working when you pan/zoom/scroll in response to your gesture events.


I think you can differentiate zoom in/zoom out and scrolling functionality by identify number of tap option on UIScrolView. Here i do same things as you want. you may try it.

   - (void)viewDidLoad {
[super viewDidLoad];

imgview=[[UIImageView alloc]initWithImage:[UIImage imageNamed:@"2.png"]];
view1=[[UIView alloc]initWithFrame:CGRectMake(0, 0, 300, 400)];
view1.backgroundColor=[UIColor greenColor];
[view1 addSubview:imgview];


objscrollview.contentMode=UIViewContentModeScaleToFill;
objscrollview.contentSize=CGSizeMake(300, 400);
objscrollview.minimumZoomScale=1;
objscrollview.maximumZoomScale=10;
[objscrollview addSubview:view1];

UITapGestureRecognizer *singleFingerTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap)];
singleFingerTap.numberOfTapsRequired = 1;
[objscrollview addGestureRecognizer:singleFingerTap];
[singleFingerTap release];
}

//Single tap on scrollview call below method
-(void)handleSingleTap
{
    NSLog(@"Singletap identify");
}


//While perform zoom  in/zoom out action on scroll view it's delegate method call
//In this method, we are return view that want to zoom in/Zoom out..


 - (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView1
{
    NSLog(@"hi++++++++++++++++++");
    return imgview;
}
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜