ios - UITableView - 在 vi​​ewDidAppear 之前滚动到底部

标签 ios swift uitableview

如果标题不明显,我想要的应该很简单,让 tableView 在用户第一次看到它时(在他看到之前)开始一直滚动到底部看到它,并且没有动画)。

所以,我知道这个问题已经回答了几次,但这些解决方案目前似乎都不起作用。 为了提供一些背景信息,我使用的是 Swift、自动布局和最新版本的 iOS。

约束

有些事情我需要支持:

  1. 在用户看到它之前加载它(显然没有动画)。
  2. 动态单元格高度,即它们的高度由 UILabel 确定(类似于消息传递应用程序 - 在 Storyboard 中使用自动布局)。
  3. 我的 UITableView 位于 UIScrollView 中(UIScrollView 水平滚动,UITableView 垂直滚动)。
  4. UITableViewchildViewController 中,也就是说,我将它添加到主 UIViewController(由于某种原因,它使 viewWillAppear 未被调用 - viewDidAppear 仍被调用)。

我将总结一下我的尝试:

至于实现:

  1. tableView.contentOffset = CGPoint(x: 0, y: CGFloat.max

  2. tableView.scrollToRowAtIndexPath(indexPathForLastItem, atScrollPosition: .Bottom, animated: false)


    var contentOffset = tableView.contentOffset
    contentOffset.y = tableView.contentSize.height - tableView.bounds.size.height
    tableView.setContentOffset(contentOffset, animated: false)


    dispatch_async(dispatch_get_main_queue(), {
        // tried option 1., 2. and 3. here
    })

至于我尝试调用这些实现的地方:

  1. viewDidLoad
  2. viewWillAppear
  3. viewDidLayoutSubviews(仅在第一次调用时,我使用一个属性来跟踪它)
  4. viewDidAppear(即使这不会给我我想要的)
  5. 在我模型的 didSet

在那些之前我总是调用 tableView.reloadData

我不想做的事:

tableView.transform = CGAffineTransformMakeScale(1, -1)

+

cell.transform = CGAffineTransformMakeScale(1, -1)

(我假设如果你想推荐这个解决方案,那是因为你知道我正在谈论的技巧。如果你不知道,那么你就不会推荐这个,所以你不需要了解它是如何工作的)

我不想要这个的原因之一是因为现在我无法滚动到顶部...

我注意到的问题:

  1. tableViewcontentSize(作为UIScrollView 的子类)在它出现后第一次滚动时发生变化。是的,我指的是 contentSize,而不是 contentOffset,它会在您滚动时改变不止一次。在您滚动整个 tableView 一次后,它就不再改变了。
  2. 有些人说它适用于更少的单元格(老实说,它在某些时候对我有用),所以至少尝试使用 20 个项目。
  3. viewWillAppear 不会被调用,但 viewDidAppear 会被调用。

任何解决方案(除了我提到的我不想要的解决方案)将不胜感激。即使是 hacky 的,只要它们不破坏其他东西。

正如旁注,scrollToRowAtIndexPath... 不缩放,也就是说,如果您有 2000 个项目,它就太慢了。所以理想情况下,我更喜欢可扩展的解决方案。

回答后的编辑:

  1. 在 @bsmith11 的回答后我尝试了:

    private var called = false
    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
    
        if !called {
            dispatch_async(dispatch_get_main_queue(), {
                self.tableView.setContentOffset(CGPoint(x: 0, y: self.tableView.bounds.height), animated: false)
            })
            called = true
        }
    }
    

    但没有成功。

最佳答案

viewDidLayoutSubviews() 中,将 .contentOffset 设置为 tableView.bounds.height。您需要在异步 block 中启动它,以便 tableView 有时间加载它的内容。

dispatch_async(dispatch_get_main_queue()) { self.tableView.setContentOffset(tableView.bounds.height, animated: false) }

viewDidLayoutSubviews() 可以被调用多次,因此您可能希望确保上面的代码只被调用一次。

关于ios - UITableView - 在 vi​​ewDidAppear 之前滚动到底部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36847628/

相关文章:

ios - 当我在 swift 中输入文本字段时移动小数点

ios - 关于带有圆角的 UIImageView

ios - Swift Parse - 使用 PFQuery 或 QueryWithSubqueries 函数

ios - 如何在发送时不显示推送消息的情况下运行该功能?

arrays - UITableView SearchBar过滤查询

iOS:从现有单元格以编程方式创建表 "header"

ios - 删除对象时 mutableArrayValueForKey NSMutableArray 崩溃

ios - OpenWeather API 中为零

ios - Swift 3 转换 unicode 字符串 U+1F600

ios - TableView 和外部数据源