簡體   English   中英

更改框架時,UIScrollView更改contentOffset

[英]UIScrollView change contentOffset when change frame

當我改變我的滾動視圖的框架時,我遇到了一些問題...有時這種改變會導致滾動,有時不會。

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

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

我無法弄清楚為什么scrollview中的按鈕會導致這個...

我已經嘗試在觸摸按鈕時調用代理(並在父視圖控制器中更改scrollview的框架)。 並嘗試在滾動視圖內更改框架(觸摸按鈕時)。 但問題以同樣的方式發生。

知道這種情況發生了什么或有些解決方法嗎?

謝謝!


我試圖將問題隔離在一起,在這里放一些代碼的簡單示例。

在我的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。

**獨立於我正在查看的頁面。

問題:使用滾動視圖內的按鈕,有時,幀更改會導致contentOffset發生更改。

  • 如果scrollview在小框架中並顯示列02並按下內部按鈕則更改框架並顯示列03和04(與按鈕相同的操作顯示在列02和03之外)。

嗯......我無法解釋得那么好,所以當發生這種情況時我會舉一個小例子。

我發現這是一個導致=> _adjustContentOffsetIfNecessary的私有方法

它在某些情況下會改變偏移量而在其他情況下不會改變。 就像我在我的例子中解釋的那樣

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

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

要再次啟用分頁,我使用委托scrollViewWillBeginDragging

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

以下是可能發生的事情:

假設你有一個滾動視圖

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。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM