[英]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發生更改。
嗯......我無法解釋得那么好,所以當發生這種情況時我會舉一個小例子。
我發現這是一個導致=> _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.