【问题标题】:How to scroll to the top of a UITableView in iOS 7如何在 iOS 7 中滚动到 UITableView 的顶部
【发布时间】:2013-12-10 23:42:56
【问题描述】:

在 iOS 7 中,我使用以下代码滚动到 UITableView 的顶部。您必须考虑半透明状态栏和导航栏的重叠。

[tableView 
    setContentOffset:CGPointMake(
        0.0, 
        -tableViewController.topLayoutGuide.length
    ) 
    animated:YES
];

这仅在您第一次调用它之后有效。在你第一次调用它时,我的表格滚动得比它应该的要远得多,显示出很多空白。此外,UIRefreshControl 似乎已冻结。您必须稍微轻推桌子以使其弹回真正的顶部。之后,您可以根据需要多次调用此代码,并且它的行为符合您的预期。

我尝试了其他方法,但它们都有问题。 iOS 6 的方式在第一次调用时表现得同样奇怪。虽然它在随后的调用中不会跳跃太多,但它们是不正确的,因为它滚动到表格顶部下方 64.0 点,因为我们忘记考虑状态和导航栏。

[table setContentOffset:CGPointZero animated:YES];

我也尝试滚动到第一个单元格,但它不会在一次调用中滚动到最顶部。每次调用它时,它只会向上滚动一页。

[tableView 
    scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] 
    atScrollPosition:UITableViewScrollPositionTop 
    animated:YES
];

【问题讨论】:

  • @DuncanGroenewald [tableView scrollRectToVisible:CGRectMake(0.0, 0.0, 1.0, 1.0) animated:YES] 一次只能向上滚动一屏。我必须多次调用它才能滚动到第一个单元格。也许这只是我的代码情况......我不知道......

标签: ios cocoa-touch uitableview ios7


【解决方案1】:

试试这个:

     NSIndexPath* top = [NSIndexPath indexPathForRow:NSNotFound inSection:0];
    [tableView scrollToRowAtIndexPath:top atScrollPosition:UITableViewScrollPositionTop animated:YES];

在 SWIFT 中

    let top = NSIndexPath(forRow: NSNotFound , inSection: 0)
    tableView.scrollToRowAtIndexPath(top, atScrollPosition: .Bottom, animated: true)

Swift 4.0 及以上版本

 let top = NSIndexPath(row: NSNotFound, section: 0)
 tableView.scrollToRow(at: top as IndexPath, at: .bottom, animated: true)

【讨论】:

  • 像所有其他尝试一样,这只会向上滚动一个屏幕的值。如果我向下滚动多个屏幕,我必须调用它很多次。
【解决方案2】:

在目标 C 中

NSIndexPath* top = [NSIndexPath indexPathForRow:NSNotFound inSection:0];
[self.tableView scrollToRowAtIndexPath:top atScrollPosition:UITableViewScrollPositionTop animated:YES];

在斯威夫特中

var scrollIndexPath: NSIndexPath = NSIndexPath(forRow:NSNotFound , inSection: 0)
self.tableview.scrollToRowAtIndexPath(scrollIndexPath, atScrollPosition: UITableViewScrollPosition.top, animated: true)

【讨论】:

    【解决方案3】:

    在 Objective-C 中

    [mainTableView setContentOffset:CGPointZero animated:YES];
    

    在 Swift 中:

    mainTableView.setContentOffset(CGPointZero, animated:true)
    

    【讨论】:

      【解决方案4】:

      这不是“魔法”。 64 偏移量用于状态栏(20 点)和导航栏(44 点)高度。如果滚动视图的偏移量为 0,并且您还有状态栏 + 导航栏,它将位于这些对象下,您将看到原始内容的 -64.0。在情节提要中有一个选项“调整滚动视图插图”,默认情况下会选中

      【讨论】:

        【解决方案5】:

        请试试这个:

        - (void)scrollToRowAtIndexPath:(NSIndexPath *)indexPath atScrollPosition:(UITableViewScrollPosition)scrollPosition animated:(BOOL)animated;
        

        样本是这样的:

        [tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] atScrollPosition:0 animated:YES];
        

        【讨论】:

          【解决方案6】:

          我查看了其他答案,发现以下解决方案对我有用。

          -(void) scrollToTop
          {
              if ([self numberOfSectionsInTableView:self.tableView] > 0)
              {
                  NSIndexPath* top = [NSIndexPath indexPathForRow:NSNotFound inSection:0];
                  [self.tableView scrollToRowAtIndexPath:top atScrollPosition:UITableViewScrollPositionTop animated:YES];
              }
          }
          

          希望,它可以解决您的问题。

          【讨论】:

            【解决方案7】:

            iOS 滚动视图的行为有点奇怪。正如您所提到的,“第一次”将 64.0 偏移量“神奇地”添加到视图层次结构中的第一个滚动视图中。我还没弄清楚为什么会这样。目前我只有一个非常老套的解决方案:您可以添加一个虚拟滚动作为视图层次结构中的第一个滚动,高度设置为 0。之后,您的解决方案应该像往常一样工作。![在此处输入图像描述][ 1]

            截图:http://imgur.com/LvrbcqG

            希望这会有所帮助。

            还有其他人知道为什么会这样吗?

            【讨论】:

              【解决方案8】:

              试试:

              [tableView
                  setContentOffset:CGPointMake(
                      tableView.contentOffset.x,
                      -tableView.contentInset.top
                  )
                  animated:YES
              ];
              

              【讨论】:

              • 这只会向上滚动一个屏幕的单元格,而不是整个表格的高度。
              • 对我来说听起来像是异常行为。根据 Apple 的文档,设置 contentOffset 应该会将您带到特定的偏移量期间。你使用的是原版 UITableView 吗?
              猜你喜欢
              • 1970-01-01
              • 2013-10-15
              • 2010-10-18
              • 1970-01-01
              • 2018-11-02
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-10-04
              相关资源
              最近更新 更多