更改滚动视图的框架时遇到一些问题...有时此更改会导致滚动,有时却不会。

这是情况。我有一个自定义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。

  • **与我正在查看的页面无关。

    问题:
    有时,使用滚动视图内部的按钮,帧更改会导致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

    这样做时,当我更改框架时,contentOffset不会更改,并且scrollView继续用于分页。

    07-25 23:07
    查看更多