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

时间:2017-10-10 06:53:58

标签: objective-c ios11 xcode9

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

[self setContentOffset:CGPointZero animated:YES];

7 个答案:

答案 0 :(得分:4)

你必须做

self.view.layoutIfNeeded()

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

答案 1 :(得分:3)

试试这个

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

答案 2 :(得分:2)

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

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

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

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

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

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

在你的代表中。

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

答案 3 :(得分:2)

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

'a * 'b -> 'b

希望有帮助。它为我固定了

答案 4 :(得分:1)

尝试一下

if tableView.numberOfRows(inSection: 0) > 0 {
    tableView.scrollToRow(at: IndexPath(row: 0, section: 0), at: .top, animated: false)
}

答案 5 :(得分:0)

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

我发现了如何使其发挥作用:

斯威夫特3,4:

public class AFS {
    public JPanel afs(final Fields input){
        JPanel titlePanel = new JPanel();

        //Title fields
        JLabel afs = new JLabel("Statement", Label.LEFT);

        Label mm = new Label("month ", Label.LEFT);
        Label my = new Label("Year ", Label.LEFT);

        //first line
        titlePanel.add(afs);
        titlePanel.add(mm);
        titlePanel.add(input.MENTRY);
        titlePanel.add(my);
        titlePanel.add(input.YENTRY);
        titlePanel.setPreferredSize(null);

        //Left Panels
        JPanel sb = new JPanel();
        JPanel entry = new JPanel();
        entry.setLayout(new BoxLayout(entry, BoxLayout.Y_AXIS));
        entry.setAlignmentX(Component.LEFT_ALIGNMENT);
        entry.add(new Label("Service "));
        entry.add(input.s);
        entry.add(new Label("Amount "));
        entry.add(input.a);
        entry.add(new Label("Counter "));
        entry.add(input.o);
        entry.add(new Label("Division "));
        entry.add(input.d);

        sb.add(entry);


        JPanel holderPanel = new JPanel();
        holderPanel.setLayout(new BoxLayout(holderPanel, BoxLayout.Y_AXIS));
        holderPanel.setAlignmentX(Component.LEFT_ALIGNMENT);
        holderPanel.add(titlePanel);
        holderPanel.add(sb);

        JButton start = new JButton("Save Current");
        start.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                ScriptAction action = new ScriptAction();
                action.saveAll(input,1);
            }
        });
        holderPanel.add(start); 
        return holderPanel;
    }

答案 6 :(得分:0)

设置scrollview的估计的RowHeight = 0,估计的SectionHeaderHeight = 0,估计的SectionFooterHeight = 0解决了该问题。每当更改内容偏移量时,UIKit就会计算每个节的行,页眉和页脚的高度,以滚动到新的偏移量。默认情况下,estimatedRowHeight,estimatedSectionHeaderHeight,estimatedSectionFooterHeight将为-1