【问题标题】:Glitchy animation of UIRefreshControl with large titles or searchbar in navigation bar导航栏中带有大图块或搜索栏的 UIRefreshControl 的小故障动画
【发布时间】:2018-05-18 21:18:31
【问题描述】:

我有一个嵌入在导航控制器中的控制器,带有大标题和 UIRefreshControl。当我在我的 tableView 上拉动刷新时,活动指示器的动画非常有问题。

我不知道我的代码中是否有不良行为?

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

【问题讨论】:

  • 同样的问题。 Li Sim 的答案修复了 50%。现在我的问题是在拉动刷新时多次触发刷新控制:(
  • 您找到解决方案了吗?我仍然有这个问题:(
  • 否 :( 但如果我重新处理这个问题,我会尽快发布!
  • 这也是普通(不大)标题的问题,但搜索栏结合了刷新控件。在 iOS 13 上遇到了这个问题。问题是由 translucent=false 引起的,并由 extendedLayoutIncludesOpaqueBars 修复
  • 问题中没有“故障”的描述。我的经验是:微调器出现了,但几乎立即消失了。后来,当我调用 endRefreshing() 时,导航栏保持较大的尺寸 - 在我向上滚动 tableview 之前它没有折叠。

标签: ios swift uinavigationbar ios11 pull-to-refresh


【解决方案1】:

如果您已将导航栏半透明外观设置为 false,那么您需要在视图控制器中包含以下代码来处理不透明栏。此外,在情节提要中,tableView 必须将顶部约束扩展到 Superview。不知何故,我不知道为什么没有适当的文档表明这一点,但它似乎解决了故障动画。

self.extendedLayoutIncludesOpaqueBars = true

此外,在@Ravi Raja Jangid 发布的链接的帮助下,我发现该设置目前运行良好。我不确定是因为 tableview 现在附加到 Superview(扩展状态栏)还是 iOS 版本升级修复了错误问题。

Explaining difference between automaticallyAdjustsScrollViewInsets, extendedLayoutIncludesOpaqueBars, edgesForExtendedLayout in iOS7

搜索控制器:

private lazy var searchController: UISearchController = {
        let searchController = UISearchController(searchResultsController: nil)
        searchController.searchResultsUpdater = self
        searchController.obscuresBackgroundDuringPresentation = false
        searchController.hidesNavigationBarDuringPresentation = false
        self.definesPresentationContext = false
        return searchController
    }()

viewDidLoad()

self.navigationItem.hidesSearchBarWhenScrolling = false
self.navigationItem.searchController = self.searchController
self.navigationController?.navigationBar.isTranslucent = false
self.extendedLayoutIncludesOpaqueBars = true

故事板设置:

【讨论】:

    【解决方案2】:

    据我所知,我建议您使用 UITableViewController 而不是嵌入了 UITableViewUIViewController

    这样做的最大好处是UITableViewController已经默认内置了很多这些东西(比如UIRefreshControl),所以你不必处理很多这些错误,添加一个@手动 987654327@ 到 UIViewController 对我来说总是有点麻烦。

    一般来说,你会想尽可能地尝试使用UITableViewController,唯一不能使用的地方是UITableView 不能占据整个UIViewController

    Check out the documentation on UITableViewController for more info.

    编辑:此外,如果您可以发布实际获取数据的代码,这将很有用,因为这通常也是问题所在。

    【讨论】:

      【解决方案3】:

      只将下面显示的代码放在 -(void)viewDidLoad 方法中:

      -(void)viewDidLoad 
      {
          self.extendedLayoutIncludesOpaqueBars = true;
          self.navigationController.navigationBar.translucent=false;
      }
      

      并确保导航栏半透明的属性设置为false,因为如果它为true,那么导航栏需要其下方的内容来反映半透明效果。更多详情可以参考this post

      有时可能会因为Controller中的某些组件(视图)破坏某些约束规则而发生。

      【讨论】:

        【解决方案4】:

        在 viewDidLoad 中试试这个代码:

        navigationController?.navigationBar.isTranslucent = true
        

        或在情节提要中设置

        对我有帮助。

        【讨论】:

          猜你喜欢
          • 2018-04-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-12-28
          • 2016-07-25
          • 1970-01-01
          相关资源
          最近更新 更多