QLPreviewController的视图

我只是试图去QLPreviewController.view。 事实上,我想捕捉一个点击事件,以显示/隐藏工具栏等我试图:

QLPreviewController* qlpc = [QLPreviewController new]; qlpc.delegate = self; qlpc.dataSource = self; qlpc.currentPreviewItemIndex=qlIndex; [navigator pushViewController:qlpc animated:YES]; qlpc.title = [path lastPathComponent]; [qlpc setToolbarItems:[NSArray arrayWithObjects:self.dirBrowserButton,self.space, self.editButton, self.btnSend, nil] animated:YES]; UITapGestureRecognizer* gestTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(showControls:)]; gestTap.cancelsTouchesInView=NO; [qlpc.view addGestureRecognizer:[gestTap autorelease]]; [qlpc release]; 

没有任何反应

如果我将UITapRecognizer附加到navigationController.view,只有当我触摸工具栏/导航栏时才触发。 在这种情况下,UISwipeGestureRecognizer工作正常。

我试图附加一个透明的覆盖视图,并添加手势识别器,但没有运气。 那么,我看到一些应用程序,实现这样的function显然是可能的,但如何? 对不起,我整天search了一下,没有find任何解决办法。 请帮帮我。

我发现这里没有任何工作的答案,但为我做的是为了inheritanceQLPreviewController并重写viewDidAppear,如下所示:

 - (void)viewDidAppear:(BOOL)animated { UITapGestureRecognizer *gestTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(showControls:)]; gestTap.cancelsTouchesInView = NO; [self.view addGestureRecognizer:[gestTap autorelease]]; } 

用你的解决scheme,QLPreviewController的视图是否还能接受? 我试图做类似的事情(我从QLPreviewController中窃取视图来使用它),它看起来像我的覆盖视图不会让任何东西通过槽到后面的视图。

我今天一直在处理这个问题,并build议重写 – (void)contentWasTappedInPreviewContentController:(id)item {}是closures的,但是当你混淆预览控制器处理。

所以我停止覆盖该方法,而是创build一个RAC信号,每当调用该方法时触发。 这并不妨碍QL的默认行为。 我在QLPreviewController的子类中做,但是这不应该是必要的。

我有一个属于我的class级:

  @property RACSignal *contentTapped; 

然后在我的QLPreviewController的子类的init方法中:

 _contentTapped = [self rac_signalForSelector:@selector(contentWasTappedInPreviewContentController:)]; 

现在在另一个class级甚至是内部,你可以使用这样的信号:

 previewController.contentTapped subscribeNext:^(id x) { // Put your handler here! }]; 

好的,解决方法非常简单。 只是在keyWindow上添加了覆盖视图。 附加的手势识别器覆盖,它的作品。

  QLPreviewController* qlpc = [QLPreviewController new]; qlpc.delegate = self; qlpc.dataSource = self; qlpc.currentPreviewItemIndex=qlIndex; [navigator pushViewController:qlpc animated:YES]; qlpc.title = [path lastPathComponent]; UIView* overlay = [[[UIView alloc] initWithFrame:navigator.view.bounds] autorelease]; [[[UIApplication sharedApplication] keyWindow] addSubview:overlay]; [overlay setNeedsDisplay]; [qlpc setToolbarItems:[NSArray arrayWithObjects:self.dirBrowserButton,self.space, self.editButton, self.btnSend, nil] animated:YES]; UITapGestureRecognizer* gestTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(showControls:)]; gestTap.cancelsTouchesInView=NO; [overlay addGestureRecognizer:[gestTap autorelease]]; [qlpc release]; 

这里是我的解决scheme(使用KVO),我正在监视导航栏状态 – 并在需要时显示工具栏(似乎在点击时它自己隐藏工具栏)

 #define kNavigationBarKeyPath @"navigationBar.hidden" static void * const NavigationBarKVOContext = (void*)&NavigationBarKVOContext; - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [self.navigationController setToolbarHidden:NO]; [self.navigationController addObserver:self forKeyPath:kNavigationBarKeyPath options:NSKeyValueObservingOptionPrior context:NavigationBarKVOContext]; } - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; [self.navigationController removeObserver:self forKeyPath:kNavigationBarKeyPath]; } 

 - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { if ( context == NavigationBarKVOContext ) { BOOL prior = [change[NSKeyValueChangeNotificationIsPriorKey] boolValue]; if ( prior && self.navigationController.toolbarHidden ) { dispatch_async(dispatch_get_main_queue(), ^{ [self.navigationController setToolbarHidden:NO animated:YES]; }); } } } 

子类QLPreviewController,然后重写

– (void)contentWasTappedInPreviewContentController:(id)item {}

这是它的!