更改滚动视图的框架时遇到一些问题...有时此更改会导致滚动,有时却不会。
这是情况。我有一个自定义UIScrollView作为根视图控制器的子视图。
在父视图控制器中,我有一个按钮可以更改滚动视图的框架。它在屏幕的2/3和全屏之间切换。此框架更改永远不会导致scrollview的contentOffset发生更改。
在滚动视图的内容中,我有一些按钮。此按钮也更改滚动视图的框架。
但是,有时,此更改使scrollview更改其contentOffset ...
我不知道为什么滚动视图内的按钮导致此...
我已经尝试在触摸按钮时调用委托(并在父视图控制器中更改scrollview的框架)。
并尝试更改scrollview内部的框架(当触摸按钮时)。但是问题以相同的方式发生。
您知道发生了什么情况或解决此问题的方法吗?
谢谢!
我试图找出问题所在,以便在此处提供一些简单的代码示例。
在我的xib中,只有带有框架((20,44),(728,300))的滚动视图和一个调用事件“btnOut”的按钮。
该滚动视图启用了“分页”功能,并且禁用了“自动调整大小”子视图(其余默认设置)。
我将使用布尔值来知道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
。这样做时,当我更改框架时,contentOffset不会更改,并且scrollView继续用于分页。