[Iphone] 如何檢測狀態欄中的觸摸


Answers

所以這是我目前的解決方案,它工作得非常好。 但請與其他想法,因為我不喜歡它...

  • 在您的視圖中添加一個滾動視圖。 也許把它藏起來,或者把它放在其他一些視圖下
  • contentSize設置為大於邊界
  • 設置一個非零的contentOffset
  • 在你的控制器中實現如下所示的滾動視圖的委託。

通過總是返回NO ,滾動視圖永遠不會滾動,每當用戶點擊狀態欄,就會得到一個通知。 但問題是,這不適用於“真正的”內容滾動視圖。 (見問題)

- (BOOL)scrollViewShouldScrollToTop:(UIScrollView *)scrollView
{
    // Do your action here
    return NO;
}
Question

我在我的應用程序中可以由用戶滾動自定義視圖。 但是,這個視圖不會從UIScrollView繼承。 現在,我希望用戶能夠將此視圖滾動到頂部,就像任何其他可滾動視圖允許的一樣。 我覺得沒有直接的辦法。

谷歌提出了一個解決方案: http : //cocoawithlove.com/2009/05/intercepting-status-bar-touches-on.html這不再適用於iOS 4.x. 這是一個不行。

我有創建一個scrollview並保持在某處的想法,只是為了趕上它的通知,然後轉發他們到我的控制。 這不是解決我的問題的好方法,所以我正在尋找“更清潔”的解決方案。 我喜歡前面提到的UIApplication子類的鏈接的一般方法。 但是什麼API可以給我可靠的信息?

有什麼想法,幫助等嗎?

編輯:另一件我不喜歡我當前的解決方案是只有當前的視圖沒有任何滾動視圖。 滾動到頂部的手勢只在正好有一個滾動視圖時才起作用。 一旦添加了虛擬物(詳見下面的答案)到另一個滾動視圖的視圖,手勢就完全禁用了。 尋找更好的解決方案的另一個原因是...




謝謝麥克斯,你的解決方案為我工作了很長時間後。

有關信息:

dummyScrollView = [[UIScrollView alloc] init];
dummyScrollView.delegate = self;
[view addSubview:dummyScrollView];
[view sendSubviewToBack:dummyScrollView];   

然後

  dummyScrollView.contentSize = CGSizeMake(view.frame.size.width, view.frame.size.height+200);
  // scroll it a bit, otherwise scrollViewShouldScrollToTop not called
  dummyScrollView.contentOffset = CGPointMake(0, 1);  

//delegate :
- (BOOL)scrollViewShouldScrollToTop:(UIScrollView *)scrollView
{
  // DETECTED! - do what you need to
  NSLog(@"scrollViewShouldScrollToTop");
  return NO;
}

請注意,我有一個UIWebView也是我必須破解我找到的某個解決方案:

- (void)webViewDidFinishLoad:(UIWebView *)wv
{  
  [super webViewDidFinishLoad:wv];  

  UIScrollView *scroller = (UIScrollView *)[[webView subviews] objectAtIndex:0];
  if ([scroller respondsToSelector:@selector(setScrollEnabled:)])
    scroller.scrollEnabled = NO; 
}



找到一個更好的解決方案,這是iOS7兼容在這裡: http ://ruiaureliano.tumblr.com/post/37260346960/uitableview-tap-status-bar-to-scroll-up

將此方法添加到您的AppDelegate中:

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [super touchesBegan:touches withEvent:event];
    CGPoint location = [[[event allTouches] anyObject] locationInView:[self window]];
    if (CGRectContainsPoint([UIApplication sharedApplication].statusBarFrame, location)) {
        NSLog(@"STATUS BAR TAPPED!");
    }
}



一種方法,可能不是最好的,可能是將一個清晰的UIView放在狀態欄的頂部,並攔截UIView的觸摸,可能會幫助你,如果沒有別的出現...




使用一個不可見的UIScrollView 。 在iOS 10和Swift 3測試

override func viewDidLoad() {
    let scrollView = UIScrollView()
    scrollView.bounds = view.bounds
    scrollView.contentOffset.y = 1
    scrollView.contentSize.height = view.bounds.height + 1
    scrollView.delegate = self
    view.addSubview(scrollView)
}

func scrollViewShouldScrollToTop(_ scrollView: UIScrollView) -> Bool {
    debugPrint("status bar tapped")
    return false
}