我可以用 UISearchController 以编程方式复制 UIStatusBar 上的点击操作吗?

Posted

技术标签:

【中文标题】我可以用 UISearchController 以编程方式复制 UIStatusBar 上的点击操作吗?【英文标题】:Can I replicate programmatically what a tap on the UIStatusBar does w/ UISearchController? 【发布时间】:2018-04-01 12:13:26 【问题描述】:

我找不到将UIScrollView 滚动到顶部的方法,就像UIStatusBarUINavigationItem 包含UISearchController 时所做的那样。在这种情况下,滚动视图滚动到顶部包括显示搜索栏。如果我尝试对通常的嫌疑人执行此操作(调用滚动、设置内容偏移等),我似乎无法让搜索栏出现。

我可以以编程方式复制点击UIStatusBar 的功能吗?

【问题讨论】:

【参考方案1】:

在我看来,我认为 Apple 在这里使用私有 API 来实现它。但是如果你想复制一些看起来像它的东西,让搜索栏出现。您可以按照以下步骤操作:

滚动UIScrollView 到顶部

self.scrollView.contentOffset = CGPointZero;

之后,显示搜索栏和大标题

// Show large title
self.navigationItem.hidesSearchBarWhenScrolling = NO;
// Show search bar
self.navigationItem.largeTitleDisplayMode = UINavigationItemLargeTitleDisplayModeAlways;

当显示搜索栏和大标题时,重置navigationItem 属性以赋予scrollView 正常行为

self.navigationItem.hidesSearchBarWhenScrolling = YES;
self.navigationItem.largeTitleDisplayMode = UINavigationItemLargeTitleDisplayModeAutomatic;

结果:

工作代码:

[UIView animateWithDuration:0.25f animations:^
  self.scrollView.contentOffset = CGPointZero;
 completion:^(BOOL finished) 
  [UIView animateWithDuration:0.25f animations:^
    self.navigationItem.hidesSearchBarWhenScrolling = NO;
    self.navigationItem.largeTitleDisplayMode = UINavigationItemLargeTitleDisplayModeAlways;
   completion:^(BOOL finished) 
    self.navigationItem.hidesSearchBarWhenScrolling = YES;
    self.navigationItem.largeTitleDisplayMode = UINavigationItemLargeTitleDisplayModeAutomatic;
  ];
];

更多详情,您可以查看my demo repo。

【讨论】:

太棒了,做到了!感谢演示程序。当UISearchBarController 重新出现时,会有一点点闪烁,但这可能是我们使用公共 API 所能做的最好的事情。恭喜! 我应该早点给出答案。两天前我本来打算回答你的问题,但因为闪烁而没有回答。最后,在没有收到反对票的情况下这样做。谢谢;)

以上是关于我可以用 UISearchController 以编程方式复制 UIStatusBar 上的点击操作吗?的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式显示 UISearchController 的搜索栏

UISearchController 以模态方式存在时的错误行为

iOS v10 或更低版本:如何以编程方式在导航栏底部添加 UISearchController

以编程方式重置 UISearchController 中的搜索查询字符串

UITableView 中 UISearchController 的背景颜色

以编程方式自动布局到 UISearchController 选择它时消失