我们在 UIKit 中发现了似乎是一个错误,但想在此处发布以查看其他人是否有此问题或找到解决方案。
我们正在尝试使用新的 iOS11 大标题和提升的搜索栏/刷新控件。我们似乎发现了一个问题,导航堆栈的根 viewController 显示了一个小的显示问题(问题 A),但是一旦另一个 viewcontroller 被推送到导航堆栈上,显示就会变得疯狂(问题 B):
注意事项:
- 堆栈中的第二个 VC 比第一个 VC 的问题更严重
- refreshControl 不是代码将其设置为您在每个屏幕上第一次看到它的绿色
- 当您拉动刷新时,refreshControl 会向下滑动,它不应该这样做
这种奇怪的行为似乎只有在我们以编程方式在 viewDidLoad 中执行“拉动刷新”时才会出现问题,以便用户在进入屏幕时可以看到数据正在加载。如果我们删除调用refreshControl?.beginRefreshing()
显示的行是干净的。我在一个示例香草应用程序中重新创建了这个问题。这是显示问题的视图控制器的全部内容:
import UIKit
class ViewController: UITableViewController {
var tableHeaderSearchController: UISearchController!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
self.navigationController?.navigationBar.prefersLargeTitles = true
self.navigationController?.navigationItem.largeTitleDisplayMode = .always
tableHeaderSearchController = UISearchController(searchResultsController: UITableViewController())
navigationItem.searchController = tableHeaderSearchController
refreshControl?.tintColor = UIColor.green
refreshControl?.backgroundColor = UIColor.clear
refreshControl?.attributedTitle = NSAttributedString(string: "Loading Stuff...", attributes: [NSAttributedStringKey.font: UIFont.systemFont(ofSize: 17)])
refreshControl?.addTarget(self, action: #selector(refreshPulled), for: .valueChanged)
// Commenting out these 2 lines makes it work fine but you can't see the initial refresh spinner
refreshControl?.beginRefreshing()
refreshPulled()
}
@objc func refreshPulled() {
DispatchQueue.main.asyncAfter(deadline: .now() + 3) { [refreshControl] in
refreshControl?.endRefreshing()
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
这是故事板。它只是一个封装在导航控制器中的普通 tableviewcontroller。3 个静态单元,第 2 个遍历到相同控制器类型的另一个实例。
任何想法将不胜感激。我们真的很想采用新的外观,但是这些东西很难做到。