我们在UIKit中发现了一个似乎是个错误,但想在此发帖,看看是否有其他人遇到此问题或找到解决方案。
我们正在尝试使用新的iOS11大型游戏和提升的搜索栏/ refreshcontrol。我们似乎发现了一个问题,导航堆栈的根viewController显示了一个小的显示问题(问题A)但是一旦另一个viewcontroller被推到导航堆栈上,显示就变得疯狂了(问题B):
注意事项:
当我们以编程方式在viewDidLoad中执行“pull to refresh”时,这种奇怪的行为似乎只是一个问题,以便用户在进入屏幕时可以看到数据正在加载。如果我们删除调用refreshControl?.beginRefreshing()
的行,则显示是干净的。我在一个样本香草应用程序中重新创建了这个问题。这是显示问题的整个viewcontroller:
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.
}
}
这是故事板。它只是一个包含在navigationController中的vanilla tableviewcontroller。 3个静态单元格,第二个静态单元格遍历同一控制器类型的另一个实例。
任何想法都将不胜感激。我们真的很想采用新的外观,但这样做很难做到这一点。
答案 0 :(得分:2)
首先,表视图在导航栏下方向上扩展并且iOS 11偏移行为是正确的是绝对至关重要的:
self.edgesForExtendedLayout = .all
self.tableView.contentInsetAdjustmentBehavior = .always
其次,滚动显示手动刷新时的刷新控制取决于你,计算金额并不简单:
self.refreshControl!.sizeToFit()
let top = self.tableView.adjustedContentInset.top
let y = self.refreshControl!.frame.maxY + top
self.tableView.setContentOffset(CGPoint(0, -y), animated:true)
self.refreshControl!.beginRefreshing()
在刷新过程中,栏仍然仍然太大,但我看不出可以做些什么。基本上Apple已经实现了大型游戏,并在导航栏中显示了刷新控制,而没有考虑效果或处理由此产生的错误。