2014-01-17 54 views
0

我正在嘗試開發新的自定義UIView(以允許水平日期選擇)。我想在XIB文件中做所有的UI設計。UIScrollView不滾動的自定義UIView部件

自定義用戶界面視圖包含一個滾動視圖,然後包含兩個「星期」視圖。這個想法是,當滾動發生時,我會移動兩個「星期」視圖並將它們重新配置到正確的日期以創建日期選擇的「無限」滾動。

我可以加載UIView,然後加載scrollview和周視圖(都在XIB中設計)。

我的DatePickerView類,從UIView類派生的滾動視圖(包含兩週視圖)的addSubview。滾動視圖的寬度爲320,contentSize的寬度爲640。 UserInteraction已啓用。水平滾動已啓用。

這個全部工作並顯示在屏幕上。周視圖每個包含7個按鈕。我可以按下他們,他們會接觸到。但是,滾動視圖似乎不想滾動。

我將自定義視圖設置爲UIScrollViewDelegatescrollViewDidScroll沒有發生任何呼叫。

對於每個周視圖,我有一個'容器'視圖,然後是按鈕。我在容器視圖中添加了以下內容(同樣來自UIView)。

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    DDLogInfo(@"Began. Next Responder: %@", self.nextResponder); 
    [self.nextResponder touchesBegan:touches withEvent:event]; 
} 

(以及類似的其他觸摸事件,touchesMoved,touchesEnded,touchesCancelled),

我打印出來的nextResponder,這是UIScrollView,所以我知道我送觸摸到查看,但我從來沒有看到scrollview想要滾動。

我的touchEvents傳遞給響應者鏈的方法是否正確?
還有什麼我需要配置讓滾動工作?

任何幫助表示讚賞。

查理

+0

這是怎麼回事? –

回答

1

如果我理解正確,你想無限滾動只有三頁的滾動視圖。我在日曆視圖項目中實現了類似的效果。 你可以從這裏DPCalendar

簡而言之結帳,我創建了像

@interface DPCalendarMonthlyView : UIScrollView 

視圖和初始像這樣

self.showsHorizontalScrollIndicator = NO; 
self.clipsToBounds = YES; 
self.contentInset = UIEdgeInsetsZero; 
self.pagingEnabled = YES; 
self.delegate = self; 

我創建這樣

[self.pagingViews addObject:[self singleMonthViewInFrame:self.bounds]]; 
[self.pagingViews addObject:[self singleMonthViewInFrame:CGRectMake(self.bounds.size.width, 0, self.bounds.size.width, self.bounds.size.height)]]; 
[self.pagingViews addObject:[self singleMonthViewInFrame:CGRectMake(self.bounds.size.width * 2, 0, self.bounds.size.width, self.bounds.size.height)]]; 
三個視圖

然後我設置內容大小,並將其滾動到t他中間

[self setContentSize:CGSizeMake(self.bounds.size.width * 3, self.bounds.size.height)]; 
[self scrollRectToVisible:((UIView *)[self.pagingViews objectAtIndex:1]).frame animated:NO]; 

在滾動視圖委託功能,我需要做的

- (void)scrollViewDidEndDecelerating:(UIScrollView *)sender 
{ 
    //If scroll right 
    if(self.contentOffset.x > self.frame.size.width) 
    { 
     //do something if scroll right 
    } else if(self.contentOffset.x < self.frame.size.width) 
    { 
     //do something else if scroll left 
    } else { 
     return; 
    } 
    //scroll back to the middle 
    [self scrollRectToVisible:((UICollectionView *)[self.pagingViews objectAtIndex:1]).frame animated:NO]; 
} 

希望這是對你有用。

+0

感謝您的回答。看起來是正確的,但我的問題是關於與XIB的交互。看起來像autoLayout不是我的朋友在這一個。 – Charlie

0

對於那些沿着這條路走下去的人,我想到了這一點,這是一個愚蠢的錯誤。我忘了關閉AutoLayout。我一直忘記蘋果把autoLayout作爲一個NIB的'文檔'級下的啓用/禁用選項(所以我忘了看那裏)。

將其關閉並按設計工作。看起來像autoLayout導致意見重新排列,不需要滾動,或相當於什麼東西。