UIScrollView setContentOffset:动画在iOS11中不起作用

问题描述 投票:4回答:6

我添加了一个方法,使滚动视图滚动到它的顶部。这在iOS10中正如预期的那样工作。但是当我使用Xcode 9升级到iOS11时,它无法正常工作。是否有任何与iOS11相关的遗漏。 下面的代码工作正常:

[self setContentOffset:CGPointZero animated:YES];
objective-c ios11 xcode9
6个回答
3
投票

试试这个

dispatch_async(dispatch_get_main_queue(), ^{
    [UIView animateWithDuration:.25 animations:^{
        [self setContentOffset:CGPointZero animated:YES];
    }];
});

7
投票

你必须做

self.view.layoutIfNeeded()

在setContentOffset之前。它更新了UIScrollView的contentSize,然后contentOffset可用。


4
投票

(SWIFT 4)我有类似的问题,问题是动画:真的。因此,您可以尝试手动执行此操作:

view.layoutIfNeeded()
UIView.animate(withDuration: 0.2) {
   self.scroll.setContentOffset(.zero, animated: false)
}

希望能帮助到你。它适合我


2
投票

修复此问题的方法(至少对我的应用程序而言)是将“beginUpdates”和“endUpdates”添加到UITableView并选择“animated:NO”,如下所示:

[mySuperbTableView beginUpdates];
[mySuperbTableView setContentOffset:CGpointMake(0,0) animated:NO];
[mySuperbTableView endUpdates];

您可以将CGPoint设置为您需要的任何东西。 ;-)

在将此更新调用到UITableView之后,请注意对数据源进行任何更改,否则会崩溃!

感谢Pavithra Pavi在另一篇文章中正确回答这个问题。

编辑:好的,它不能一直工作。更好的解决方案(如果您选择不为tableview设置动画)是设置table.estimatedRowHeight = 0;

在你的代表中。

它似乎修复了setContentOffset的行为:动画:NO。


1
投票

设置estimatedRowHeight = 0,estimatedSectionHeaderHeight = 0,estimatedSectionFooterHeight = 0为scrollview解决了问题。每当内容偏移量改变时,UIKit计算每个部分的行,页眉和页脚的高度以滚动到新的偏移量。 estimatedRowHeight,estimatedSectionHeaderHeight,estimatedSectionFooterHeight默认为-1


0
投票

正如@Alejandro之前提到的,iOS 11确实存在setContentOffset和动画的问题。

我发现了如何使它工作:

斯威夫特3,4:

if #available(iOS 11.0, *) {
     let offset = CGPoint(x: -scrollView.adjustedContentInset.left, y: -scrollView.adjustedContentInset.top)
     scrollView.setContentOffset(offset, animated: false)
} else {
     let offset = CGPoint(x: -scrollView.contentInset.left, y: -scrollView.contentInset.top)
     scrollView.setContentOffset(offset, animated: false)
}
© www.soinside.com 2019 - 2024. All rights reserved.