2014-02-14 62 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