2017-11-24 16 views
4

UITableView(およびMKMapViewも含まれていますが、うまくいけばそれは問題ではありません)を含むUIViewControllerにUISearchControllerを追加しようとしています。私はRay Wenderlich's tutorialを追跡しましたが、私は行動の面で同じ結果を得ることはできません。私は9.1にiOS版をサポートする必要があるため途中で#availableテストがあることをUISearchControllerが期待通りに表示されない

override func viewDidLoad() { 
     super.viewDidLoad() 

     // Setup the Search Controller 
     searchController.searchResultsUpdater = self 
     searchController.obscuresBackgroundDuringPresentation = false 
     searchController.searchBar.placeholder = NSLocalizedString("Search references by project, customer or city", comment: "") 
     if #available(iOS 11.0, *) { 
      navigationItem.searchController = searchController 
      navigationItem.hidesSearchBarWhenScrolling = true 
     } else { 
      tableView.tableHeaderView = searchController.searchBar 
     } 
     definesPresentationContext = true 

     self.modeSelector.layer.cornerRadius = 5.0 

     if let split = splitViewController { 
      let controllers = split.viewControllers 
      detailViewController = (controllers[controllers.count - 1] as! UINavigationController).topViewController as? ReferenceViewController 
     } 

     self.navigationItem.rightBarButtonItem?.isEnabled = false 
    } 

注:

は、ここに私のviewDidLoadです。

今、私はいくつかの問題を参照してください。

  • 検索バーがすぐに表示され、私は検索バーにフォーカスすると
  • をスクロールして、それを隠すことができない、テーブルビューの上部には固執しないがナビゲーション項目の下に:

enter image description here

私はレイWenderlichのサンプルプロジェクトを参照して唯一の大きな違いは、ということであるので、私はXcode 9でプロジェクトを作成しましたが、私のストーリーボードでは上部と下部のレイアウトガイドは使用しませんが、安全な領域を使用しています。関連性があるかどうかはわかりませんが、それが私が見る唯一のことです。

何が起こっているのか、どうすればこの問題を解決できますか?

+0

View Controllerをクリックし、AIで 'Adjust Scroll View Insets'を選択します。これが役立つことを願っています。 –

+0

@DharmeshKheniいいえ、何も変わりません。同じ振る舞い。 – Sebastien

+0

@matt何も変更しません。 – Sebastien

答えて

1

iOSを9.1までサポートする必要がある場合は、おそらく9.1より古いバージョンのエミュレータを使用します。したがって、「おそらく」obscuresBackgroundDuringPresentationは、searchControllerに正しく影響しません。これはiOS 9.1以降でのみ使用可能なためです。 9.1までサポートするdimsBackgroundDuringPresentationを追加します。これは期待通りに表示するために解決しない場合は

if #available(iOS 9.1, *) { 
    searchController?.obscuresBackgroundDuringPresentation = false 
} else { 
    searchController?.dimsBackgroundDuringPresentation = false 
} 

、私はこの問題は、あなたのレイアウト制約についてであることをほとんど確信しています。レイアウトを安全な領域に合わせることができない場合は、現在の制約を追加してください。

+0

この「利用可能な場合」は何も変更されませんでしたが、私は制約を見てIBで何か変わったものを見つけました:tableViewの上限は次のようでした: - Table View.Top Equal Superview.Top - 定数:0 私はこれはに変更する場合: - 表View.Topイコール安全Area.Top - 定数:0 iOSの11、上の私は検索バーをアクティブにするときにもかかわらず、私に期待されるレイアウトを与えているようだ テーブルビューは検索バーアニメーションの終わりが正しい場所に行くのを待ちます。しかしそれで十分です。今度は、デフォルトで検索バーが表示される理由を理解する必要があります。 – Sebastien

+1

テーブルに "Align Top to:Safe Area - Constant = 0"という制約を追加することは、この場合は不思議です。 :)次は何をしたいですか?それでも問題を理解できない場合は、現在の進捗状況を示すためのスクリーンショットをいくつか追加してもよいでしょうか? –

+1

このコントローラーで同じデータのテーブルとマップビューを切り替えるので、tableHeaderView戦略に戻ってしまいました。マップモードで検索バーを表示したくありません。それとレイアウトの上部を安全な領域に合わせると、まだiPhone Xにわずかな不具合がありますが、私の顧客の誰もそれを持っていないので問題ありません。 – Sebastien

3

あなたはXcodeの9(IOS 11)を使用している場合、これはあなたに

+0

ありがとう。 iOS 11では、テーブルビューの上部がナビゲーションバーの下部に貼り付けられています。しかし、検索バーはデフォルトではまだ表示されていますが、スクロールすると検索バーはそのまま残ります。 – Sebastien

+0

さらに、私がそれを行うと、それは私がその後に押す他のすべてのビューコントローラをねじます。 – Sebastien

+0

残りのビューコントローラ 'self.navigationController?.navigationBar.isTranslucent = true' use –

0

を助けるあなたのviewDidload

self.navigationController?.navigationBar.isTranslucent = false 

希望にこのコードの行の下に使用。次に、本当にやりたいことは - ios 11デバイスの新しいハイライトである新しいブロードナナビゲーションバーを使用します。しかし、ios-11に移行していない人が多いため、以前のバージョンのデバイスも考慮されています。 新しいバーに検索バーを追加するには、スクロール時に検索バーを表示し、ユーザーがページをスクロールするときに非表示にする次の関数を使用しました。

func addSearchBar() { 
if #available(iOS 11.0, *) { 
    let sc = UISearchController(searchResultsController: nil) 
    sc.delegate = self 
    let scb = sc.searchBar 
    scb.tintColor = UIColor.white 
    scb.barTintColor = UIColor.white 
    //Change the colors as you like them 
    if let textfield = scb.value(forKey: "searchField") as? UITextField { 
    textfield.textColor = UIColor.blue 
    if let backgroundview = textfield.subviews.first { 

     // Background color 
     backgroundview.backgroundColor = UIColor.white 

     // Rounded corner 
     backgroundview.layer.cornerRadius = 10; 
     backgroundview.clipsToBounds = true; 
    } 
    } 

    if let navigationbar = self.navigationController?.navigationBar { 
    navigationbar.barTintColor = UIColor.white 
    } 
    navigationItem.searchController = sc 
    navigationItem.hidesSearchBarWhenScrolling = true 
}else{ 
//add the logic for previous version devices here. 
} 

そこにバグがxcode9であり、インターフェースビルダーから、それを設定する(まだ)は動作しませんように私はまたのviewDidLoadで self.navigationController?.navigationBar.prefersLargeTitles = true;を設定しています。

次のような方法がhere

0

から撮影された私は、それが空白まで表示され、あなたのセクションヘッダだと思います。 heightForHeaderInSectionを0に設定して、viewForHeaderInSectionにnilを返します。

+0

いいえ、私はちょうどそれら2を追加しました。結果はまったく同じです。 – Sebastien

関連する問題