web-dev-qa-db-ja.com

UISearchControllerがアクティブな場合、iOS 9のsearchBarはテーブルヘッダービューから消えます

構造:

View1(ボタンをクリック)->モーダルモードで表示(MyModalView:UITableViewController)

MyModalViewには、UISearchControllerが埋め込まれています。 UISearchControllerのsearchBarはMyModalView.tableView.tableHeaderViewに配置されます。

IOS 8.0以降、正常に動作しています。ただし、iOS 9では、UISearchControllerがアクティブになるとsearchBarが消えます。以下の論文写真をご覧ください

モーダルビュー: modal view

IOS 8でアクティブなUISearchController: search bar in iOS 8

IOS 9でアクティブなUISearchController: search bar in iOS 9

非常に標準的なコード:

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ベータ版でも発生します...

どんなアイデア/ポインタも大歓迎です

乾杯。

53
David Trang

私たち全員が同じ問題を抱えているようですが、それらは異なる方法で解決されました。しかし、提案された答えのどれも私のために働いた:(。それにもかかわらずあなたの時間をありがとう。

私の問題を解決する解決策を得ました。インターフェイスビルダーを使用して、ストーリーボードで[エッジの拡張-私の不透明バーの下(MyModalView:UITableViewController)]をtrueに設定しています。

要約すれば:

MyModalView:UITableViewController、ストーリービルダーでInterface Builderを使用

エッジの延長:-上部バーの下にチェックマーク-下部バーの下にチェックマーク-不透明バーの下にチェックマーク

screenshot

66
David Trang

何が問題なのか正確にはわかりませんが、次のように「修正」しました。

self.searchController.hidesNavigationBarDuringPresentation = NO;
self.definesPresentationContext = NO;

私の推測では、UISearchControllerは、ナビゲーションバーとして表示しようとしているときに、ファンキーなことをしていると考えられます。したがって、これはハックですが、少なくともユーザーをブロックしません。検索バーはクールなアニメーションを実行せず、ナビゲーションバーを隠します。

68
Shwethascar

この問題の原因は、ストーリーボードのシミュレートされたメトリック(上部のバー)であることがわかりました。私の場合、次の行は機能しますが、それでも理由はわかりません。

- (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;
}
36
wiles duan

そうしなければならなかった

self.aNavigationController?.extendedLayoutIncludesOpaqueBars = true

同様の質問 here を見つけましたが、私の場合はviewDidLoadメソッドにはありませんでした。うまくいくまで、さまざまなビューを試す必要がありました。これで、カスタムナビゲーションバーの色と検索バーの両方を使用できるようになりました。

19
jigzat

@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;
}
10
patrick kuang

私の場合、削除して修正しました

definesPresentationContext = true

これを削除することの欠点があるかどうかはまだテストしていません!

同じ問題があり、XcodeでUIをデバッグしたときに、UISearchBarビューが別のビューに移動され、幅がゼロになっていることがわかりました。

definesPresentationContextUISearchControllerプロパティをfalseに設定し、それを含むtrueUITableViewControllerを設定することで修正しました。

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)
}
2

アプリのこの場所にはナビゲーションバーがありません。他のSO投稿は役に立たなかったので、このように修正しました:

- (void)layoutSubviews
{
    [[[self searchController] searchBar] sizeToFit];
}
2
igraczech

ストーリーボードでナビゲーションバーを永続的に半透明に設定すると、問題が解決しました。

1
Per

できます

override func viewDidLoad() {
    super.viewDidLoad()

    self.extendedLayoutIncludesOpaqueBars = !self.navigationController!.navigationBar.translucent
}
1
Victor Gomes
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
    }()
0
Murat Akdeniz

ナビゲーションバーを非表示にし、検索コントローラーを全画面表示する場合は、ナビゲーションバーで次の設定を行います。検索バーは消えません。

navigationController?.navigationBar.translucent = true
0
mike.tihonchik

それらのどれも私のために働いた、私はこのハックを使用してそれを修正しました

func position(for bar: UIBarPositioning) -> UIBarPosition {
    if UIDevice.current.userInterfaceIdiom == .pad {
        return .top
    } else {
        if iOSVersion <= 9 {
            return .top
        }
        return .topAttached
    }


}
0
Elsammak