iOS11 上的Programmatic beginRefreshing() 有largeTitles 模式的问题
Posted
技术标签:
【中文标题】iOS11 上的Programmatic beginRefreshing() 有largeTitles 模式的问题【英文标题】:Programmatic beginRefreshing() on iOS11 has problems with largeTitles mode 【发布时间】:2018-01-19 18:15:25 【问题描述】:我们在 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 个遍历相同控制器类型的另一个实例。
任何想法将不胜感激。我们真的很想采用新的外观,但是这让我们很难做到。
【问题讨论】:
我知道这没什么用,但是 UIRefreshControl 在我的项目中也有很多大标题。有时大标题会“卡住”约 40 点低于应有的值,就像刷新控件仍在占用空间一样。您的情况可能很独特,但我见过其他问题,例如 ***.com/q/47649785 和 ***.com/q/46595093 和 ***.com/q/45294850。 @CraigOtis 是的,我已经看到了其他一些问题。我制作的这个例子没有不透明的条(所有默认值,例如半透明),但它的行为很糟糕。很高兴听到人们遇到的其他问题。听起来好像刷新控件的“提升”还没有完全成熟。 【参考方案1】:首先,表格视图在导航栏下方向上延伸是绝对关键的,这就是 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已经实现了大标题并在导航栏中显示了刷新控件,而没有考虑效果或处理由此产生的错误。
【讨论】:
很好的建议,但是将这些应用于我创建的示例项目并不能解决示例中的行为。特别是刷新完成后第二个 VC 上的混乱以上是关于iOS11 上的Programmatic beginRefreshing() 有largeTitles 模式的问题的主要内容,如果未能解决你的问题,请参考以下文章
您可以同时使用 Storyboard 和 Programmatic Code 吗?
ROS进二阶学习笔记 - programmatic way to start/stop a roslaunch
DB2在dbvisualizer 客户端执行begi/end 语句块