2012-06-04 87 views
26

我試圖實現一個自定義選項卡欄,它是可滾動的並且在每個選項卡欄項都有分頁。爲此,我使用委託scrollViewWillEndDragging:withVelocity:targetContentOffset:它完美地解決了一個問題。scrollViewWillEndDragging:withVelocity:targetContentOffset:不工作在UISCrollView的邊緣

我分頁的工作原理是,如果contentOffset是正確的項目接近的方式,它的targetContentOffset變爲該項目的偏移量。左側是同樣的東西。

問題是,無論何時我在第一個項目的左半部分和最後一個的右側部分(滾動視圖水平工作),它應該轉到ContentOffset 0和最右邊項目的內容偏移量(減去屏幕上的那些),但它不是。

我與調試器檢查和targetContentOffset-> x是確實0(在第一種情況下 - 左最左邊項目的)。所以問題是UIScrollView不在那裏滾動。我迷路了。

這是我實現的委託:圖解釋什麼是我想要做的

- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView 
       withVelocity:(CGPoint)velocity 
      targetContentOffset:(inout CGPoint *)targetContentOffset{ 
    NSInteger index = lrintf(targetContentOffset->x/self.tabWidth); 
    targetContentOffset->x = index * self.tabWidth; 
} 

這裏。

|-------|-------|-------|-------|-------|-------|-------| 
|  |  |  |  |  |  |  | 
|  |  |  |  |  |  |  | 
|_______|_______|_______|_______|_______|_______|_______| 

     |_______________________________________| 
     where it is and i scroll it to the left 

    <----| 

    |_______________________________________| 
       where it would stop 

|_______________________________________| 
     where i want it to stop 

回答

14

這是一個衆所周知的問題。經過一些調查和與其他人交談後,有人建議它可能是一個錯誤,結果證明是正確的。我向蘋果公司報告,它被標記爲重複,但仍然是開放的。只是回答你們的同樣問題。我的解決方法就像Big Papoo建議的那樣,通過使用接近我想要的偏移量(0.1似乎這樣做)。對於右端來說也是一樣。

+0

我也遇到過這個問題。你有可能發佈Apple Bug ID號碼或更好的鏈接到OpenRadar條目 - 幫助我自己和其他人發佈重複的錯誤報告? (這是衆所周知的,蘋果公司根據他們收到的報告數量優先處理錯誤。) – Calrion

+0

當然。它是10255505的副本,但它似乎並不存在於OpenRadar中。無論如何,它現在似乎已經關閉,但我不知道他們是否會發布修復程序。 – dvieira

3

我發現2種,你可以調查無證行爲: - 設置零作爲最後偏移不工作,我建議把1或任何大於零(0.5可以正常工作,未測試) - 你最好檢查速度符號並計算最終偏移量,使其位於用戶移開手指的當前點的左側或右側。不要試圖讓滾動在另一邊倒退。

+0

非常感謝您的回答。你是對的。我也調查過,並與其他人交談,發現這是一個錯誤。只是忘了回答我自己的問題,對不起(如果你想了解更多細節,請看看它)。像0.1這樣的偏移似乎就是這樣做的。無論如何,非常感謝。 – dvieira

0

如果您使用的是水平表視圖,那麼你的scrollViewWillEndDragging內:withVelocity:targetContentOffset:功能,您可以撥打:

[self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:<index> inSection:<section>] atScrollPosition:UITableViewScrollPositionTop animated:YES]; 

我發現這工作比試圖操縱targetContentOffset-好得多> y在水平表視圖中。

8

我嘗試設置最後偏移的東西稍微偏離零或內容大小由大Papoo的建議,但注意到,這消除了過度滾動反彈。我對這個解決方案是檢查原來targetContentOffset,看它是否等於零或contentSize和離開它,如果它是:

- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset { 

    float expectedOffset = targetContentOffset->x; 
    if (expectedOffset == 0 || expectedOffset == scrollView.contentSize.width) return; // Scroll view will bounce so leave the targetContentOffset. 

    float targetOffset = [self roundedOffset:expectedOffset]; // Round your offset. 

    // Adjust the offset to make sure it works. 
    if (targetOffset == 0) targetOffset = 1; 
    else if (targetOffset == SCROLLVIEW_WIDTH) targetOffset = SCROLLVIEW_WIDTH - 1; 

    targetContentOffset->x = targetOffset; 
} 

你當然也可以再使用scrollViewDidEndDecelerating:向移動滾動視圖是1點。

8

問題已修復iOS 6.0。

現在,它的工作原理應該如此。