2009-09-18 51 views
8

我有一個UIScrollView與分頁(所以典型的模型與UIPageControl和頁面之間左右拖/甩),我有工作正常。奇怪的是,當我想擺脫反彈(這樣你就不會看到左側和右側UI背後的黑色)時,突然分頁不再有效。UIScrollView - (反彈=否)似乎覆蓋(pagingEnabled =是)

換句話說,當:

scrollView.pagingEnabled = YES; 
scrollView.bounces = YES; 

一切工作正常,但我不喜歡在頁面(0)和頁(長度爲1)的彈跳。但是當我這樣做時:

scrollView.pagingEnabled = YES; 
scrollView.bounces = NO; 

它停止在每個頁面捕捉到位,而是將所有頁面視爲一個長頁面。所以看起來由於某種原因分頁取決於彈跳,只要我能以某種方式停止彈跳就可以了。那麼,還有其他方法可以擺脫它嗎?還是有什麼我做錯了?

編輯: 解決辦法:

@interface PagingScrollView : UIScrollView 
@end 

@implementation PagingScrollView 

- (id)initWithFrame:(CGRect)frame 
{ 
    if (self = [super initWithFrame:frame]) 
    { 
     self.pagingEnabled = YES; 
     self.bounces = YES; 
    } 
    return self; 
} 

- (void)setContentOffset:(CGPoint)offset 
{ 
    CGRect frame = [self frame]; 
    CGSize contentSize = [self contentSize]; 
    CGPoint contentOffset = [self contentOffset]; 

    // Clamp the offset. 
    if (offset.x <= 0) 
     offset.x = 0; 
    else if (offset.x > contentSize.width - frame.size.width) 
     offset.x = contentSize.width - frame.size.width; 

    if (offset.y <= 0) 
     offset.y = 0; 
    else if (offset.y > contentSize.height - frame.size.height) 
     offset.y = contentSize.height - frame.size.height; 

    // Update only if necessary 
    if (offset.x != contentOffset.x || offset.y != contentOffset.y) 
    { 
     [super setContentOffset:offset]; 
    } 
} 

@end 

回答

9

你最好的選擇將是寫一個UIScrollView子類,手動執行所需的行爲。您應該可以從pagingEnabledbounces開始,它們都設置爲YES,然後用您自己的方法覆蓋-setContentOffset:以剪切邊緣。

+0

哇,這很愚蠢。那麼,我會試試看,你可能只是這個話題中的「大贏家」。 – Eli 2009-09-21 18:14:55

+0

它的工作原理,但你需要重寫-setContentOffset,而不是-setContentOffset:動畫,因爲後者將調用一個並不總是調用的函數,而前者覆蓋contentOffset的mutator函數,以便捕獲所有的情況。 – Eli 2009-09-22 18:19:36

+0

這很奇怪。我做了很多類似的事情,通常單參數方法會調用具有動畫的動畫變體:YES – rpetrich 2009-09-22 20:30:00