结构:
View1(点击按钮) - >模态地呈现(MyModalView:UITableViewController)
MyModalView嵌入了UISearchController。 UISearchController的searchBar放在MyModalView.tableView.tableHeaderView中。
自iOS 8.0以来,它一直运行良好。但是在iOS 9上,当UISearchController处于活动状态时,searchBar会消失。请看下面的图片
非常标准的代码:
override func viewDidLoad() {
super.viewDidLoad()
// Dynamically create a search controller using anonymous function
self.resultSearchController = ({
let controller = UISearchController(searchResultsController: nil)
controller.searchResultsUpdater = self
controller.dimsBackgroundDuringPresentation = false
controller.searchBar.sizeToFit()
controller.searchBar.delegate = self
self.tableView.tableHeaderView = controller.searchBar
return controller
})()
// Auto sizing row & cell height
self.tableView.estimatedRowHeight = 130
self.tableView.rowHeight = UITableViewAutomaticDimension
self.definesPresentationContext = true
// No footer for better presentation
self.tableView.tableFooterView = UIView.init(frame: CGRectZero)
}
此问题也发生在iOS 9.1 beta ...
任何想法/指针都会深表赞赏
干杯。
答案 0 :(得分:68)
我不确定究竟是什么问题,但我已经修复了'它由:
self.searchController.hidesNavigationBarDuringPresentation = NO;
self.definesPresentationContext = NO;
我的猜测是UISearchController
在尝试呈现为导航栏时正在做一些时髦的事情。所以,这是一个黑客,但它至少不会阻止用户。搜索栏不会执行很酷的动画并掩盖导航栏。
答案 1 :(得分:66)
似乎我们所有人都遇到了同样的问题,但他们以不同的方式解决了。然而,没有一个建议的答案对我有用:(。尽管如此,谢谢大家的时间。
我找到了解决问题的解决方案。它使用Interface Builder在Storyboard中将我的(MyModalView:UITableViewController)的Opaque Bars下的Extend Edges设置为true。
总结:
MyModalView:UITableViewController,在Storyboard中使用Interface Builder
延伸边缘: - 在顶部栏下勾选 - 在底栏下方勾选 - 在不透明栏下打勾
答案 2 :(得分:36)
我发现故事板中的模拟指标(顶部栏)导致了这个问题。 就我而言,以下几行有效,但我仍然不知道为什么。
- (void)willPresentSearchController:(UISearchController *)searchController {
// do something before the search controller is presented
self.navigationController.navigationBar.translucent = YES;
}
-(void)willDismissSearchController:(UISearchController *)searchController
{
self.navigationController.navigationBar.translucent = NO;
}
答案 3 :(得分:19)
我不得不
self.aNavigationController?.extendedLayoutIncludesOpaqueBars = true
我发现了一个类似的问题here,但就我而言,它不在viewDidLoad方法上。我必须尝试不同的观点,直到它奏效。现在我可以同时拥有自定义导航栏颜色和搜索栏
答案 4 :(得分:10)
感谢@wiles duan和@Techprimate
就我而言,我通过设置:
解决了这个问题<label>Recinto</label>
<select class="form-control" data-toggle="modal" data-target="#cria-recinto">
<option data-toggle="modal" data-target="#cria-recinto">O meu coliseu</option>
<option>volvo</option>
<option>A minha arena</option>
<option>a garagem da minha vizinha</option>
<option>Na esquina</option>
</select>
<script type="text/javascript">
$('select').change(function () {
if ($(this).val() == "volvo") {
$('#cria-recinto').modal('show');
}
});
</script>
在UISearchControllerDelegate
中实现以下两种方法self.definesPresentationContext = NO;
答案 5 :(得分:6)
我通过删除
来修复它 definesPresentationContext = true
我还没有测试是否有任何删除它的缺点!
答案 6 :(得分:2)
我在应用的这个地方没有导航栏。其他SO帖子都没有帮助我,所以我已经用这种方式解决了这个问题:
- (void)layoutSubviews
{
[[[self searchController] searchBar] sizeToFit];
}
答案 7 :(得分:2)
我遇到了同样的问题,当我在Xcode上调试UI时,发现UISearchController
视图已移至另一个视图,宽度为零。
我通过将false
的{{1}}属性设置为true
,并为包含UITableViewController
设置viewDidLoad()
来修复此问题。
我只在override func viewDidLoad() {
super.viewDidLoad()
// Dynamically create a search controller using anonymous function
self.resultSearchController = ({
let controller = UISearchController(searchResultsController: nil)
controller.searchResultsUpdater = self
controller.dimsBackgroundDuringPresentation = false
controller.definesPresentationContext = false // Disable the presentation controller
controller.searchBar.sizeToFit()
controller.searchBar.delegate = self
self.tableView.tableHeaderView = controller.searchBar
return controller
})()
// Auto sizing row & cell height
self.tableView.estimatedRowHeight = 130
self.tableView.rowHeight = UITableViewAutomaticDimension
self.definesPresentationContext = true // This one remains the same
// No footer for better presentation
self.tableView.tableFooterView = UIView.init(frame: CGRectZero)
}
添加了一行。
public function rules()
{
return [
'name' => 'sometimes|required',
'email' => 'sometimes|required|email',
'age' => 'sometimes|required|integer|min:15',
];
}
答案 8 :(得分:1)
在storyboard中将navigationBar永久设置为半透明解决了我的问题。
答案 9 :(得分:1)
它有效
override func viewDidLoad() {
super.viewDidLoad()
self.extendedLayoutIncludesOpaqueBars = !self.navigationController!.navigationBar.translucent
}
答案 10 :(得分:0)
如果您想要隐藏导航栏并全屏显示搜索控制器,请在导航栏上设置以下内容,搜索栏不会失败:
navigationController?.navigationBar.translucent = true
答案 11 :(得分:0)
sc.hidesNavigationBarDuringPresentation = false
为我做了诀窍
lazy var searchController:UISearchController = {
let sc = UISearchController(searchResultsController: nil)
sc.searchResultsUpdater = self
sc.obscuresBackgroundDuringPresentation = false
sc.searchBar.placeholder = "Search"
sc.hidesNavigationBarDuringPresentation = false
return sc
}()
答案 12 :(得分:0)
他们都没有为我工作,我使用此技巧对其进行了修复
func position(for bar: UIBarPositioning) -> UIBarPosition {
if UIDevice.current.userInterfaceIdiom == .pad {
return .top
} else {
if iOSVersion <= 9 {
return .top
}
return .topAttached
}
}