構造:
View1(ボタンをクリック)->モーダルモードで表示(MyModalView:UITableViewController)
MyModalViewには、UISearchControllerが埋め込まれています。 UISearchControllerのsearchBarはMyModalView.tableView.tableHeaderViewに配置されます。
IOS 8.0以降、正常に動作しています。ただし、iOS 9では、UISearchControllerがアクティブになるとsearchBarが消えます。以下の論文写真をご覧ください
IOS 8でアクティブなUISearchController:
IOS 9でアクティブなUISearchController:
非常に標準的なコード:
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ベータ版でも発生します...
どんなアイデア/ポインタも大歓迎です
乾杯。
私たち全員が同じ問題を抱えているようですが、それらは異なる方法で解決されました。しかし、提案された答えのどれも私のために働いた:(。それにもかかわらずあなたの時間をありがとう。
私の問題を解決する解決策を得ました。インターフェイスビルダーを使用して、ストーリーボードで[エッジの拡張-私の不透明バーの下(MyModalView:UITableViewController)]をtrueに設定しています。
要約すれば:
MyModalView:UITableViewController、ストーリービルダーでInterface Builderを使用
エッジの延長:-上部バーの下にチェックマーク-下部バーの下にチェックマーク-不透明バーの下にチェックマーク
何が問題なのか正確にはわかりませんが、次のように「修正」しました。
self.searchController.hidesNavigationBarDuringPresentation = NO;
self.definesPresentationContext = NO;
私の推測では、UISearchController
は、ナビゲーションバーとして表示しようとしているときに、ファンキーなことをしていると考えられます。したがって、これはハックですが、少なくともユーザーをブロックしません。検索バーはクールなアニメーションを実行せず、ナビゲーションバーを隠します。
この問題の原因は、ストーリーボードのシミュレートされたメトリック(上部のバー)であることがわかりました。私の場合、次の行は機能しますが、それでも理由はわかりません。
- (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;
}
そうしなければならなかった
self.aNavigationController?.extendedLayoutIncludesOpaqueBars = true
同様の質問 here を見つけましたが、私の場合はviewDidLoadメソッドにはありませんでした。うまくいくまで、さまざまなビューを試す必要がありました。これで、カスタムナビゲーションバーの色と検索バーの両方を使用できるようになりました。
@wiles duanと@Techprimateに感謝
私の場合、次の設定によりこの問題を修正しました。
self.definesPresentationContext = NO;
UISearchControllerDelegateで次の2つのメソッドを実装します
- (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;
}
私の場合、削除して修正しました
definesPresentationContext = true
これを削除することの欠点があるかどうかはまだテストしていません!
同じ問題があり、XcodeでUIをデバッグしたときに、UISearchBar
ビューが別のビューに移動され、幅がゼロになっていることがわかりました。
definesPresentationContext
のUISearchController
プロパティをfalse
に設定し、それを含むtrue
にUITableViewController
を設定することで修正しました。
viewDidLoad()
に1行だけ追加しました。
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)
}
アプリのこの場所にはナビゲーションバーがありません。他のSO投稿は役に立たなかったので、このように修正しました:
- (void)layoutSubviews
{
[[[self searchController] searchBar] sizeToFit];
}
ストーリーボードでナビゲーションバーを永続的に半透明に設定すると、問題が解決しました。
できます
override func viewDidLoad() {
super.viewDidLoad()
self.extendedLayoutIncludesOpaqueBars = !self.navigationController!.navigationBar.translucent
}
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
}()
ナビゲーションバーを非表示にし、検索コントローラーを全画面表示する場合は、ナビゲーションバーで次の設定を行います。検索バーは消えません。
navigationController?.navigationBar.translucent = true
それらのどれも私のために働いた、私はこのハックを使用してそれを修正しました
func position(for bar: UIBarPositioning) -> UIBarPosition {
if UIDevice.current.userInterfaceIdiom == .pad {
return .top
} else {
if iOSVersion <= 9 {
return .top
}
return .topAttached
}
}