Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

iOS 6 UIGestures (Swipe) stops working with QLPreviewController

In iOS 6 beta 4 and iOS 5.1.1 I have had left/right swipes allowing users to swipe between different QLPreviewControllers, hosted in a UIViewController.

In the released version of iOS 6 the swipes are now completely ignored.

Attempted to put a UIView as a subview of the preview controller in an attempt to get the view hosting the preview controller to intercept the swipes before the preview controller has a chance to swallow them, but these are never triggered.

Any one seen this or know of a work around.

Thanks,

like image 848
Ben Whiting Avatar asked Sep 21 '12 12:09

Ben Whiting


3 Answers

I had the same problem but with UITapGestureRecognizer not working on QLPreviewController. In iOS 6 that thing is like a black hole for UIGestureRecognizer objects...nothing makes it out of there!

However I did find a workaround. I am subclassing QLPreviewController, so in my subclass I abused the (relatively) new viewWillLayoutSubviews method and added the following snippet:

UIView *overlay = [[UIView alloc] initWithFrame:self.view.frame];
overlay.backgroundColor = [UIColor whiteColor];
overlay.alpha = .002f;
for (UIView *v in self.view.subviews)
{
    [v addSubview:overlay];
}
[overlay release];

It may be overkill, but I basically went into the all of the quick look subviews and added a view to them that WOULD accept the gesture. I went with .002 alpha because making it lower would cause the gestures to be ignored again.

like image 175
ghostatron Avatar answered Oct 18 '22 18:10

ghostatron


I have also found that using the same code, UIGestureRecognizers have stopped working under iOS 6. But it is not that totally broken. Apple Development Sample project "SimpleGestureRecognizers" still functions. After comparing the code, I found that explicitly "addGestureRecognizer" resolved the problem (besides all the other steps you used to do under IB). Assuming your one of your IBOutlets names leftSwiftRecognizer, you could do:

- (void)viewDidLoad
{
    [super viewDidLoad];
    ....
    // swipe recognizer
    [self.view addGestureRecognizer:self.leftSwiftRecognizer];

}
like image 36
icezee Avatar answered Oct 18 '22 17:10

icezee


Your attempted solution was close, but probably backwards from what you should have done. Instead of adding another view as a subview of the preview controller, add the preview controller as a subview of the UIView.

Subview the preview controller inside a standard UIView. Then, reassign your gestures to the UIView's gestureRecognizers collection, removing them from the QLPreviewController's collection.

Not sure why this changed, but I had the same issue with my app, except for me it was the UITableView that wasn't scrolling anymore.

like image 1
David Morton Avatar answered Oct 18 '22 17:10

David Morton