UIScrollView不会在iOS 7中滚动到底部

时间:2014-02-13 01:34:22

标签: ios iphone objective-c uiscrollview contentoffset

在以下代码示例中,self.contentView引用了相关的UIScrollView

// Scroll to bottom.
CGPoint bottomOffset = CGPointMake(0, self.contentView.contentSize.height - 
                                   self.contentView.bounds.size.height);
if (bottomOffset.y >= 0.0)
{
    [self.contentView setContentOffset:bottomOffset animated:YES];
}

奇怪的是,在iOS 6中,这种方法非常合适,但在iOS 7中滚动视图(假设它的contentSize垂直大于它frame.size.height)滚动到底部最底部的子视图添加到滚动视图。

例如,如果以下情况成立:

self.contentView.frame.size.height == 50.0
self.contentView.contentSize.height == 100.0

aSubView.frame.origin.y == 50.0
aSubView.frame.size.height == 20.0

滚动代码只会滚动,直到aSubView可见; <{1}}而不是self.contentView.contentOffset.y == 20.0,它位于整个滚动视图的底部。

这是(当然)直到以编程方式将另一个子视图添加到self.contentView.contentOffset.y == 50.0(通过用户交互),然后一切都自行纠正。

为清楚起见,我在滚动代码之前和之后设置了断点,以衡量对self.contentView的更改。

其他有趣的事实是,如果我删除self.contentView.contentOffset并直接设置animated,它会在iOS 7上按预期运行,但我更喜欢保留动画。

注意:不使用界面构建器

4 个答案:

答案 0 :(得分:7)

只需一行..你可以滚动到底部..!

[yourScrollview scrollRectToVisible:CGRectMake(yourScrollview.contentSize.width - 1, yourScrollview.contentSize.height - 1, 1, 1) animated:YES];

答案 1 :(得分:5)

因此,通过将调用包装在异步调度块中,我很快就找到了一个非常不满意的解决方案。

// Scroll to bottom.
CGPoint bottomOffset = CGPointMake(0, self.contentView.contentSize.height
                                   - self.contentView.bounds.size.height);
if (bottomOffset.y >= 0.0)
{
    dispatch_async(dispatch_get_main_queue(), ^{
        [self.contentView setContentOffset:bottomOffset animated:YES];
    });
}

如果有人理解导致问题的真正原因并且可以提供更好的解决方案,我很乐意接受这个答案,但是对于处理同一问题的其他人来说,希望这也适合你。

答案 2 :(得分:0)

禁用“调整滚动视图插图”为我解决了这个问题。 (Xcode 6,iOS 8)

UIScrollView Not Scrolling

答案 3 :(得分:-1)

您可以在滚动视图的主视图的“文件检查器”窗格中取消选择“使用Autolayout”。这可能对您有所帮助。 UIScrollView doesn't scroll after upgrading to iOS7 / xcode 5