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 吗?

使用pm2 programmatic api重命名进程

ROS进二阶学习笔记 - programmatic way to start/stop a roslaunch

DB2在dbvisualizer 客户端执行begi/end 语句块

iOS 8、iOS 9、iOS 10 和 iOS 11 上的 UITabBar 的高度是多少?

iOS 11 上的 MKAnnotationView setImage() 有动画