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


Answers

所以這是我目前的解決方案,效果非常好。 但請帶上其他想法,因為我不喜歡它...

  • 在視圖中的某處添加滾動視圖。 也許隱藏它或將其放在其他視圖之下等。
  • 將其contentSize設置為大於邊界
  • 設置非零contentOffset
  • 在您的控制器中實現scrollview的委託,如下所示。

通過始終返回NO ,滾動視圖永遠不會向上滾動,只要用戶點擊狀態欄,就會收到通知。 但問題是,這不適用於“真實”內容滾動視圖。 (見問題)

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

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

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

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

有什麼想法,幫助等等嗎?

編輯:我不喜歡我當前解決方案的另一件事是它只有在當前視圖沒有任何滾動視圖時才有效。 滾動到頂部的手勢只有在周圍只有一個滾動視圖時才有效。 只要將虛擬對象添加到具有另一個滾動視圖的視圖(請參閱下面的詳細說明),手勢就會完全禁用。 尋找更好解決方案的另一個原因......




謝謝Max,您的解決方案經過多年的努力尋找後,對我有用。

有關信息:

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 ://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!");
    }
}



如果您只是在點擊狀態欄時嘗試將UIScrollView滾動到頂部,則值得注意的是,如果您的視圖控制器在其子視圖中具有scrollsToTopscrollsToTop設置為YES UIScrollView ,則這是默認行為

所以我只需要去找任何其他UIScrollView (或子類: UITableViewUICollectionView ,並設置scrollsToTopNO

公平地說,我在原始問題中鏈接到帖子中發現了這個信息,但它也因為不再工作而被駁回,所以我跳過它並且只在隨後的搜索中找到了相關的部分。




使用不可見的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
}



Links