2011-05-22 58 views
3

我只是想去QLPreviewController.view。事實上,我要趕在其視圖點擊事件來顯示/隱藏工具欄等等。我想:QLPreviewController的視圖

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可以正常工作。

我試圖附加一個透明的覆蓋視圖,並添加手勢識別器,但沒有運氣。 那麼,我看到一些應用程序實現了這樣的功能,所以顯然這是可能的,但是如何? 對不起,我整天搜索並沒有找到任何解決方案。請幫幫我。

回答

0

我沒有發現這裏的答案的工作,但我做的一個是繼承QLPreviewController並覆蓋viewDidAppear像這樣:

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

對我不適用... – Martin 2012-11-10 01:12:59

0

好的,解決方法非常簡單。 剛剛在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]; 
1

有了您的解決方案,QLPreviewController的視圖是否仍然接受觸摸?我試圖做類似的事情(我從QLPreviewController中竊取視圖來使用它),它看起來像我的覆蓋視圖不會讓任何東西通過槽到它後面的視圖。

+0

都能跟得上。 QLPreviewController和它的視圖一無所獲。 – ensoreus 2011-09-15 08:07:53

-1

子類QLPreviewController,然後覆蓋

- (空)contentWasTappedInPreviewContentController:(id)item {}

這就是它的!

+0

該代理不適用於iOS – animaonline 2016-01-29 12:35:36

1

我今天一直在處理這個問題,並建議覆蓋 - (void)contentWasTappedInPreviewContentController:(id)item {}是關閉的,但是當你這樣做時,你會混淆預覽控制器處理。

因此,我停止覆蓋該方法,而是創建一個RAC信號,只要調用方法就會觸發。這並不妨礙QL的默認行爲。我在QLPreviewController的子類中執行它,但這不應該是必需的。

我有我的類的屬性:

@property RACSignal *contentTapped; 

然後在我的QLPreviewController的子類的我的init方法:

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

現在另一個類,甚至在內部,你可以使用像信號這個:

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

不幸的是,即使上述解決方案做了我所需要的一切,但由於使用'contentWasTappedInPreviewContentController'方法,Apple不接受提交'官方api方法'。 – 2014-03-17 14:37:27

+0

只是隱藏該方法...;) – dwery 2014-12-13 17:36:25

1

這是我的解決方案(使用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]; 
      }); 
     } 
    } 
} 
相關問題