2014-02-14 61 views
3

當我更改我的滾動視圖的框架時,有一些問題...有時這種更改會導致滾動,有時不會。UIScrollView更改contentOffset當更改框架

這是情況。我有一個自定義的UIScrollView作爲我的根視圖控制器的子視圖。 在父視圖控制器中,我有一個按鈕來更改滾動視圖的框架。它在2/3的屏幕和全屏之間變化。此幀更改從不會導致scrollview的contentOffset發生更改。

在scrollview的內容中,我有一些按鈕。這些按鈕也會更改滾動視圖的框架。 但是,有時候,這種變化使滾動視圖改變其contentOffset ...

我想不通爲什麼滾動視圖內的按鈕使這...

我已經嘗試調用一個委託當按鈕被觸摸時(並且改變父視圖控制器中的滾動視圖的框架)。 並嘗試更改滾動視圖內的框架(當按鈕被觸摸時)。但問題同樣出現。

任何想法正在發生什麼或解決這種情況?

謝謝!


我試圖隔離這個問題,把這個簡單的例子與代碼。

在我的xib中,只有一個帶有框架((20,44),(728,300))的滾動視圖和一個調用事件「btnOut」的按鈕。 該滾動視圖的Paging Enabled和Autoresize Subviews已禁用(其餘爲默認)。

我將使用布爾值來知道scrollview是否大(bigScroll)。

這裏是我的viewDidLoad:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // the initial frame of scrollView is the big frame 
    _bigScroll = YES; 

    // here I put a big content to create some pages in scrollView 
    [_scrollView setContentSize:CGSizeMake(2184, 300)]; 

    // I put one button in each column 
    // When scrollView is with big frame it shows two columns and when it is with small frame it shows only one column. 

    UIButton *btn01 = [UIButton buttonWithType:UIButtonTypeSystem]; 
    [btn01 setFrame:CGRectMake(159, 30, 46, 30)]; 
    [btn01 setTitle:@"01" forState:UIControlStateNormal]; 
    [btn01 addTarget:self action:@selector(btnIn:) forControlEvents:UIControlEventTouchDown]; 
    [_scrollView addSubview:btn01]; 

    UIButton *btn02 = [UIButton buttonWithType:UIButtonTypeSystem]; 
    [btn02 setFrame:CGRectMake(523, 30, 46, 30)]; 
    [btn02 setTitle:@"02" forState:UIControlStateNormal]; 
    [btn02 addTarget:self action:@selector(btnIn:) forControlEvents:UIControlEventTouchDown]; 
    [_scrollView addSubview:btn02]; 

    UIButton *btn03 = [UIButton buttonWithType:UIButtonTypeSystem]; 
    [btn03 setFrame:CGRectMake(887, 30, 46, 30)]; 
    [btn03 setTitle:@"03" forState:UIControlStateNormal]; 
    [btn03 addTarget:self action:@selector(btnIn:) forControlEvents:UIControlEventTouchDown]; 
    [_scrollView addSubview:btn03]; 

    UIButton *btn04 = [UIButton buttonWithType:UIButtonTypeSystem]; 
    [btn04 setFrame:CGRectMake(1251, 30, 46, 30)]; 
    [btn04 setTitle:@"04" forState:UIControlStateNormal]; 
    [btn04 addTarget:self action:@selector(btnIn:) forControlEvents:UIControlEventTouchDown]; 
    [_scrollView addSubview:btn04]; 

    UIButton *btn05 = [UIButton buttonWithType:UIButtonTypeSystem]; 
    [btn05 setFrame:CGRectMake(1615, 30, 46, 30)]; 
    [btn05 setTitle:@"05" forState:UIControlStateNormal]; 
    [btn05 addTarget:self action:@selector(btnIn:) forControlEvents:UIControlEventTouchDown]; 
    [_scrollView addSubview:btn05]; 

    UIButton *btn06 = [UIButton buttonWithType:UIButtonTypeSystem]; 
    [btn06 setFrame:CGRectMake(1979, 30, 46, 30)]; 
    [btn06 setTitle:@"06" forState:UIControlStateNormal]; 
    [btn06 addTarget:self action:@selector(btnIn:) forControlEvents:UIControlEventTouchDown]; 
    [_scrollView addSubview:btn06]; 
} 

兩項行動 「btnIn」 和 「btnOut」 調用同一個函數(changeFrameScrollView)。

- (void)changeFrameScrollView { 
    _bigScroll = !_bigScroll; 

    if (_bigScroll) { 
     [_scrollView setFrame:CGRectMake(20, 44, 728, 300)]; 
    } else { 
     [_scrollView setFrame:CGRectMake(20, 44, 364, 300)]; 
    } 
} 

我期待什麼: 使用按鈕即出的滾動型的,框架的變化可以作爲我的預期。

  • 如果它變成小框架,它會從右側隱藏列並繼續顯示左側的列。
  • 如果它變成大框架,它將顯示右邊的列並且不移動contentOffset。

**與我正在查看的頁面無關。

問題: 使用scrollview內部的按鈕,有時框架更改會導致contentOffset更改。

  • 如果scrollview在一個小框架中,它顯示的是02列,我按下里面的按鈕它改變框架並顯示03和04列(與按鈕相同的動作在顯示列02和03之外)。

那麼......我不能很好地解釋,所以我舉了一個小例子,當發生這種情況。

+0

也許有些代碼會有所幫助。另外,描述內容偏移量的變化。 – Mundi

回答

1

我發現,是導致一私人方法=>_adjustContentOffsetIfNecessary

它在某些情況下更改了偏移量,並且在其他情況下不會更改。就像我在我的例子中解釋的那樣

如果禁用了分頁以便解決我的問題,則不會調用私有方法我創建了UIScrollView的子類並覆蓋了方法touchesShouldBegin(僅當按下scrollView內的按鈕時才調用該方法)並禁用分頁:

- (BOOL)touchesShouldBegin:(NSSet *)touches withEvent:(UIEvent *)event inContentView:(UIView *)view { 
    [self setPagingEnabled:NO]; 
    return YES; 
} 

要重新設置分頁,我使用代理scrollViewWillBeginDragging

這樣做,當我更改框架並且scrollView繼續使用分頁時,contentOffset不會更改。

-1

以下是可能發生的:

假設你有

contentSize.height | 200 
frame.size.height | 100 
contentOffset.y  | 0 

滾動視圖,然後一半的內容將不可見。如果你改變了frame

frame.size height | 200 

contentOffset不應該改變。

但是,如果你開始

contentSize.height | 200 
frame.size.height | 100 
contentOffset.y  | 100 

,做同樣的改變,我會假設滾動視圖將嘗試它的內容融入可見幀,所以你會與

結束
contentOffset.y  | 0 

再次,有效地從100改變爲0。

+0

在這種情況下,更改是可以接受的,因爲它沒有更多內容可顯示,因此它會調整contentOffset以適應可見框架,如您所說。 但在我的情況下,調整發生在內容的中間......並且我無法理解。我放了一些代碼來顯示發生了什麼。 感謝您的關注! – Yudmt