2016-09-06 15 views
4

とよく遊んでいない私は私の現在の設定がされている問題があります。2つのビューコントローラをスワップアウト用> AのViewController - - > UINavigationControllerUISearchController - 子ビューコントローラ

のUITableViewControllerを。

各子ビューコントローラには、それぞれに関連付けられたUISearchControllerがあります。 UISearchBarがアクティブになると、正しい位置に表示されることはありません。

extension MySearchViewController: UISearchControllerDelegate { 

    func willPresentSearchController(searchController: UISearchController) { 
     var adjustedOrigin = searchController.searchBar.frame.origin 
     //FIXME: There's some odd behavior with embedded child VCs where the status bar adjustments are not taken into consideration 
     adjustedOrigin.y += UIApplication.sharedApplication().statusBarFrame.height 
     searchController.searchBar.frame.origin = adjustedOrigin 
     definesPresentationContext = false 
     navigationController?.definesPresentationContext = true 
     navigationController?.extendedLayoutIncludesOpaqueBars = true 
    } 

    func didPresentSearchController(searchController: UISearchController) { 
     definesPresentationContext = true 

    } 

    func didDismissSearchController(searchController: UISearchController) { 
     var adjustedOrigin = searchController.searchBar.frame.origin 
     //FIXME: There's some odd behavior with embedded child VCs where the status bar adjustments are not taken into consideration 
     adjustedOrigin.y -= UIApplication.sharedApplication().statusBarFrame.height 

     searchController.searchBar.frame.origin = adjustedOrigin 
    } 

} 

あなたは私が手動でこれまで好まないことであるUISearchBarのオフセットを修正しようとしているとして、原点を調整することが、上記で見ることができます。私はストーリーボードの下に、そして階層内のほぼどこでもコードを使って、ディスプレイを(多くの領域で)チェックアウトしようとしました。私は相殺の原因を見つけることができません。デフォルトでは、UISearchBarのようなすべての方法ステータスバーの下に表示されます。

search screen

これはまだ少しオフになっている私の手動調整なしです。

誰にでも解決策がありますか?


編集1:親の中で何かがVCがめちゃくちゃにされていることを

さらなる証拠を提示するときUISearchBarの実際にスーパーが-20でオフセットされ、オフセット。したがって、次のように問題を修正します。

import UIKit 

class MySearchController: UISearchController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     edgesForExtendedLayout = .Top 
     extendedLayoutIncludesOpaqueBars = true 
     automaticallyAdjustsScrollViewInsets = true 

     // Do any additional setup after loading the view. 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    override func viewDidLayoutSubviews() { 
     super.viewDidLayoutSubviews() 
     print(active) 

     if active && searchBar.superview!.frame.origin != CGPoint.zero { 
      searchBar.superview?.frame.origin = CGPoint.zero 
     } 
    } 
} 
+0

VCの子供の奇妙な制約があるかどうかチェックしましたか? – brkr

+0

あなたはそれが何を意味するか分かりません。 UISearchControllerは、子VCの自動レイアウト制約とは別のものです。影響を受けるのはUISearchBar(プレゼンテーションモードでUISearchControllerに注入されたときにコンテナ内にある)だけです。 UISearchBarは、指定された制約に基づくレイアウトを使用しないようにマスク制約を適切に変換します。 – TheCodingArt

+0

ほとんどの場合、これは間違いなく、私が知る限りでは、文脈上のオフセットを伝達しているもののために何かをチェーン上で伝達するものです。 – TheCodingArt

答えて

0

以下は、検索コントローラが誤って調整していたステータスバーのオフセットに合わせて調整できる唯一の方法です。

override func viewDidLayoutSubviews() { 
    super.viewDidLayoutSubviews() 

    //FIXME: Unfortunate hack required to adjust for offset of -20 pulled from ????? where ????? 
    guard let searchBarContainerView = searchBar.superview where (active && searchBarContainerView.frame.origin != CGPoint.zero) else { 
     return 
    } 
    searchBarContainerView.frame.origin = CGPoint.zero 
} 

物理的な起点はステータスバーの高さである-20によってオフセットされています。補正は、原点が強制的に0に設定されていることを確認することでした。

また、これはUISearchControllerサブクラス内のオーバーライドされたメソッドであることにも注意してください。

-1

将来の参考として、通常、この種の奇妙な点の鍵は、誰がプレゼンテーションコンテキストを定義しているかです。ドキュメントから

https://developer.apple.com/documentation/uikit/uiviewcontroller/1621456-definespresentationcontext

コンテキストベースのプレゼンテーションが発生し、UIKitは提示ビューコントローラで始まり、は、ビューコントローラの階層を歩きます。このプロパティの値がtrueであるビューコントローラを検出すると、そのビューコントローラは新しいビューコントローラを表示するように要求します。表示コントローラがプレゼンテーションコンテキストを定義していない場合、UIKitはウィンドウのルートビューコントローラにプレゼンテーションを処理するように要求します。

したがって、階層内の正しいビューコントローラがdefinedPresentationContextをYESに設定していることを確認する必要があります。これが正しく配置されている場合は、オフセットやフレームの変更は必要ありません。あなたのケースでは、おそらくあなたの親VCは、プレゼンテーションコンテキストを定義し、子VCがそれをYESに設定していないことを確認する必要があります。

+0

上記のコードを参照すると、その正確な値があまりにも下手すぎて正しく処理されませんでした。私はその特定のフラグを適切に設定しておき、それが成功することなく期待したものに合うように操作しました。したがって、この状況のた​​めの実用的なコードサンプルがない限り、この回答は何も意味しませんし、ドキュメントの投稿以外の質問には何も寄与しません。 – TheCodingArt

+0

私は気づいているのは、あなたがwillPresentでそれを無効にし、didPresentを有効にしているときに、definesPresentationContextの使い方を誤解しているということです。このフラグは、parentVisual/ChildVCの階層内のどのView ControllerがsearchVCを提示する適切な場所にビューを保持するために制約が適用されるため、検索バーのプレゼンタでtrueに設定します。自分の経験では、オフセット、フレームなどを微調整しなければならないときに、物事を一定の場所に保つためには、通常は何かが概念的に間違っているという悪い匂いがあります。お役に立てれば。 – Emilio

+0

私は使い方を誤解していませんが、大丈夫です。このシナリオをテストするとき、ここに戻る理由がありました。それにもかかわらず、これは解説された解説ではなく、解決策を提供しません。 – TheCodingArt

関連する問題