[Swift4] UIRefreshControl指示器出现在不同位置

时间:2018-11-22 05:54:35

标签: ios swift

我正在尝试使用Xcode 10.1(10B61)和Swift4制作一个iOS应用。

我有一个关于UIRefreshControl Indicator外观的问题,如下图所示。

IssueImage UIRefreshControl脚本编写在每个TableViewController类中(有关刷新功能的相同代码)。

class TableViewController1: UITableViewController  {

override func viewDidLoad() {
    super.viewDidLoad()

    refreshControl = UIRefreshControl()
    refreshControl?.addTarget(self, action: #selector(onRefresh), for: .valueChanged)
}

class TableViewController2: UITableViewController  {

override func viewDidLoad() {
    super.viewDidLoad()

    refreshControl = UIRefreshControl()
    refreshControl?.addTarget(self, action: #selector(onRefresh), for: .valueChanged)
}

任何人请给我一些建议。

谢谢。

3 个答案:

答案 0 :(得分:2)

发生这种情况是由于事物的组合。

  1. 您正在使用较大的标题作为导航控制器。这使得TableViewController(实际上是任何可滚动视图)将其refreshControl放在导航栏上。此行为是iOS 11 https://developer.apple.com/documentation/uikit/uinavigationbar/2908999-preferslargetitles

  2. 中引入的
  3. 您正在使用两个可滚动视图,其中一个绑定到导航栏,另一个不绑定。在调试过程中,我发现层次结构中的第一个可滚动视图将其refreshControl附加到导航栏。

因此,这意味着我们可以通过在层次结构底部的某个位置放置一些假的或虚拟的可滚动视图来修复它,以便首先将其refreshControl绑定到导航栏。从iOS 11开始,即使您未明确声明,任何可滚动视图都可能具有refreshControl及其“绑定”。

在这种情况下,您可以通过以下方式在容器之前添加UIScrollView

- View -- Safe Area -- UIScrollView (dummy) -- ContainerView ---- TableView 1 ---- TableView 2 ...

答案 1 :(得分:0)

试试这个-

class TableViewController2: UITableViewController  {

override func viewDidLoad() {
    super.viewDidLoad()

    refreshControl = UIRefreshControl()
    refreshControl?.addTarget(self, action: #selector(onRefresh), for: .valueChanged)
  //Updated code.. this will fix it
  self.tableView.addSubview(refreshControl)

}

让我们知道..正在工作吗?

答案 2 :(得分:0)

TableviewController 1

class TableViewController1: UITableViewController  {

    var refreshControl = UIRefreshControl()

    override func viewDidLoad() {
    super.viewDidLoad()


    refreshControl?.addTarget(self, action: #selector(onRefresh), for: .valueChanged)
    tableView1.addSubview(refreshControl)    // Added Line

}

TableviewController 2

class TableViewController2: UITableViewController  {

    var refreshControl = UIRefreshControl()

    override func viewDidLoad() {
    super.viewDidLoad()


    refreshControl?.addTarget(self, action: #selector(onRefresh), for: .valueChanged)

    tableView2.addSubview(refreshControl)    // Added Line

}