web-dev-qa-db-ja.com

UISearchBarController iOS 11の問題-SearchBarとスコープボタンが重複しています

参照 here および here 。最初のリンクに回答がありません。 2番目のリンクでは、答えは受け入れられませんが、Apple開発者フォーラムへのリンクはエラーになります。

IOS 11より前:

enter image description here

iOS 11:

enter image description here

:同じデバイスの同じコード。
また、これは、この機能を使用するすべてのアプリを再公開する必要があることを意味しますか?

13
Nitish

これらの行を追加すると修正されました:

override func viewDidLayoutSubviews() {
    self.searchController.searchBar.sizeToFit()
}
7
Rodge

次のコードを使用して、iOS11で正しく表示される初期外観を取得できます(Gregの回答による)。

[self.searchController.searchBar sizeToFit];

if (@available(iOS 11.0, *)) {
    self.navigationItem.searchController = self.searchController;
    self.navigationItem.hidesSearchBarWhenScrolling = NO;
} else {
    // Fallback on earlier versions
    self.tableView.tableHeaderView = self.searchController.searchBar;
}

ただし、検索バーがアクティブな間にアプリがバックグラウンドにされて復元された場合、上記のNitishの2番目のスクリーンショットに示すように、外観が重なり合ってしまいます。

次の回避策で修正できました。

[[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationDidBecomeActiveNotification object:nil queue:nil usingBlock:^(NSNotification * _Nonnull note) {
    self.searchController.searchBar.showsScopeBar = NO;
    [self.searchController.searchBar sizeToFit];
    self.searchController.searchBar.showsScopeBar = YES;
    [self.searchController.searchBar sizeToFit];
}];

(検索バーがアクティブなときにインターフェイスの向きを変更した後のレイアウトの問題を回避する方法については現在取り組んでいますが、それでも結局はオーバーラップします。)

2
StephenT

Ray Wenderlichが提出したレーダーでは、@ benckがWWDCから answer を投稿しました。

1
Blake

私のアプリで同じ問題に遭遇しました。私のソリューションはiOS 11で、Apple navigationItemにあるsearchBarの新しい方法を提案しました。以下のように:

if #available(iOS 11.0, *) {
    navigationController?.navigationBar.prefersLargeTitles = false
    navigationItem.searchController = searchController
    navigationItem.hidesSearchBarWhenScrolling = false
    searchViewHeight.constant = 0
} else {
    searchView.addSubview(searchController.searchBar)
}

SearchViewとsearchViewHeightの2つのIBOutletsがあります。

@IBOutlet var searchView: UIView!
@IBOutlet var searchViewHeight: NSLayoutConstraint! // new added for iOS 11

IOS 11より前は、viewControllerの階層は次のとおりです。

My searchView before iOS 11

SearchControllerのsearchBarビューを含む高さ44のsearchViewがあります。ナビゲーションバーの下にあります。

IOS 11では、searchViewの高さ制約に新しいIBOutletを追加し、定数を0に設定して、このコンテナービューを非表示にします。そして、ナビゲーション項目の一部としてsearchControllerを追加します。

Appleのドキュメントを参照してください: https://developer.Apple.com/documentation/uikit/uinavigationitem/2897305-searchcontroller

もう1つはiOS 11の下にあります。searchBarのtextFieldの背景色は、デフォルトではナビゲーションバーの色よりも少し暗いです。一貫性を保つために、白に変更できます。以下のコードはiOS11とそれ以前の両方で機能します:

if let textField = searchController.searchBar.value(forKey: "searchField") as? UITextField {
    if let backgroundView = textField.subviews.first {

        // Search bar textField background color
        backgroundView.backgroundColor = UIColor.white

        // Search bar textField rounded corner
        backgroundView.layer.cornerRadius = 10
        backgroundView.clipsToBounds = true
    }
}
1
tiantong

あなたのコメントによると、あなたのUISearchControllerUISearchBarはあなたのUITableViewtableHeaderViewに割り当てられています。 iOS 11では、代わりにUISearchControllerをビューのsearchControllernavigationItemプロパティに割り当てる必要があります。 UISearchBarをどこにでも割り当てる必要がなくなりました。この新しいプロパティの Appleのドキュメント を参照してください。

1
greg

解決策は、ナビゲーションバーに検索バーを追加することだと思います。

navigationController?.navigationBar.prefersLargeTitles = true // Navigation bar large titles
navigationItem.title = "Contacts"
navigationController?.navigationBar.largeTitleTextAttributes = [NSAttributedStringKey.foregroundColor : UIColor.white]
navigationController?.navigationBar.barTintColor = UIColor(displayP3Red: 0/255, green: 150/255, blue: 136/255, alpha: 1.0)

let searchController = UISearchController(searchResultsController: nil) // Search Controller
navigationItem.hidesSearchBarWhenScrolling = false
navigationItem.searchController = searchController

UISearchBarControllerの例を見つけることができます-SearchBarとスコープボタンが重複している here

0
Amine