2017-08-20 11 views
3

iOS 10では問題なく使えますが、iOS 11とXcode Beta 5で問題なく動作するアプリがありますスコープバーは底から切り取られたように見えます。 (Xcodeのベータ版とiOS 11のすべてのバージョンで同じだった)誰かが私を正しい方向に向けることができたら本当にうれしい。おかげで、あなたの上スウィフト4 - iOS 11検索バーのスコープが表示されません

Initial Screen

は、私はハンバーガーのメニューボタンを押したときに、私が見るものを見ることができます。ここには問題ありません.. searchbarには、クリックしたときに表示されるスコープバーもあります。プログラムで表示するように設定していませんでしたが、スコープボタンのタイトルが設定されているときのデフォルト動作です。

問題:

problem

私は上記の画面が表示された情報を入力して検索バーをクリックしてください。 iOS 10では問題はありませんでした。しかし、今は、iOS 11で、私は何でも私はそれがiOS 10で動作するように動作させることはできません。検索スコープバーは、下からカットされたように表示されます。

これはiOSの10に表示する方法であり、私はiOSの中で私が貼り付けています

storyboard view of the screen

画面の11

workingInIOS10

ストーリーボードビューになりたいです関連するコードはここにあります。

class SlideMenuViewController: UIViewController,UITableViewDelegate,UITableViewDataSource,UISearchControllerDelegate,UIGestureRecognizerDelegate{ 

    let searchController = UISearchController(searchResultsController: nil) 

    @IBOutlet var sview: UIView! 

    @IBOutlet var tableView: UITableView! 



override func viewWillAppear(_ animated: Bool) { 
//some non relevant code before this 

if sview.subviews .contains(searchController.searchBar) { 
      print("Already contains") 


     } else { 

      sview.addSubview(searchController.searchBar) 
      print(searchController.searchBar.showsScopeBar) 

      searchController.searchBar.sizeToFit() 
      searchController.searchBar.frame.size.width = view.frame.size.width 



      searchController.searchBar.barTintColor = searchBarTintColor 

      searchController.searchBar.tintColor = searchTintColor 
     } 



    } 


override func viewDidLoad() { 

//some other code 

searchController.searchBar.delegate = self 

searchController.searchBar.scopeButtonTitles = [NSLocalizedString("İsimlerde", comment: ""), NSLocalizedString("Açıklamalarda", comment: "")] 

     searchController.searchBar.returnKeyType = UIReturnKeyType.done 

searchController.searchResultsUpdater = self 

     searchController.dimsBackgroundDuringPresentation = false 
     definesPresentationContext = true 

//some other code 

} 

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 

    if searchController.isActive && searchController.searchBar.text != "" { 

     switch scpglobal { 
      case NSLocalizedString("İsimlerde", comment: ""): 
       return filteredIsimler.count 

      case NSLocalizedString("Açıklamalarda", comment: ""): 
       return filteredAciklamalar.count 

      default: 
       print("Tableview default") 
     } 

     } 



     return isimlerArray.count 
    } 

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 

//some code about search here but nothing that will result in that behaviour 

} 

func searchBarCancelButtonClicked(_ searchBar: UISearchBar) { 
     print("cancel") 
     searchController.searchBar.text = "" 

    } 


func updateSearchResults(for searchController: UISearchController) { 


     let searchBar = searchController.searchBar 



     let scope = searchBar.scopeButtonTitles![searchBar.selectedScopeButtonIndex] 
     filterContentForSearchText(searchText: searchController.searchBar.text!, scope: scope) 
     tableView.reloadData() 
    } 

} 


extension SlideMenuViewController:UISearchBarDelegate { 
    func searchBar(_ searchBar: UISearchBar, selectedScopeButtonIndexDidChange selectedScope: Int) { 
     filterContentForSearchText(searchText: searchController.searchBar.text!, scope: searchController.searchBar.scopeButtonTitles![selectedScope]) 
    } 
} 

編集:これは、検索バーに制約を追加するとどうなりますか。まずすべてが良いようです。

withConstraints1st

あなたが検索バーをクリックしたときに、このhappens..Searchバーが画面の外に移動。矢印を参照してください。

withConstraints2nd

しかし、あなたは

withConstraints3rd

それをスライドメニューを閉じて再度開く場合は、キャンセルボタンをクリックするまで、すべてがOKに動作します。その後、検索バーの動作を確認するために、このすべてを再度実行する必要があります。制約の

コード

searchController.searchBar.translatesAutoresizingMaskIntoConstraints = false 
sview.addConstraint(NSLayoutConstraint(item: searchController.searchBar, attribute: .top, relatedBy: .equal, toItem: sview, attribute: .top, multiplier: 1, constant: 0)) 
sview.addConstraint(NSLayoutConstraint(item: searchController.searchBar, attribute: .bottom, relatedBy: .equal, toItem: sview, attribute:.bottom, multiplier: 1, constant: 0)) 

sview.addConstraint(NSLayoutConstraint(item: searchController.searchBar, attribute: .leading, relatedBy: .equal, toItem: sview, attribute: .leading,multiplier: 1, constant: 0)) 
sview.addConstraint(NSLayoutConstraint(item: searchController.searchBar, attribute: .trailing, relatedBy: .equal, toItem: sview, attribute: .trailing, multiplier: 1, constant: 0)) 
+0

あなたが検索バーの制約を追加しましたか? –

+0

@ImadAliはそれを試した。同じか悪い結果。 – TheTeacher33

答えて

2

私は、カスタムsearchBarsearchControllerを置き換えることによって、問題を解決することができました。

let searchBar = UISearchBar(frame:CGRect(x: 0, y: 0, width: 266, height: 100)) 

searchBarShouldBeginEditingsearchBarShouldEndEditing

searchBar.sizeToFit 

を使用することを忘れていないか、または他にあなたがそう

searchBar.showsScopeBar = true 

を使用している場合は特に不思議なUIの問題を抱えているかもしれません、しかし注意してください、同様の問題が発生した場合は、searchControllerを取り除き、searchBarとその代理人メソッドを実装してください。それはあなたに同じscopeBarアニメーションを与えませんが、少なくともそれは動作します。この方法のもう一つの欠点は、searchBar.isTranslucent = trueがあれば、searchBarの中に別のscopeBarのゴーストがあるかもしれないということです。だから、誰もがこの問題を解決するためのより良い方法を思い付く場合、私はすべての耳...

サンプル委任セットアップ

func searchBarShouldBeginEditing(_ searchBar: UISearchBar) -> Bool { 
    searchBar.showsScopeBar = true 
    searchBar.sizeToFit() 
    searchBar.setShowsCancelButton(true, animated: true) 
    return true 
} 

func searchBarShouldEndEditing(_ searchBar: UISearchBar) -> Bool { 
    searchBar.showsScopeBar = false 
    searchBar.sizeToFit() 
    searchBar.setShowsCancelButton(false, animated: true) 
    return true 
} 
+0

searchBar.sizeToFit()は、スコープのあるiOS11の問題のヒントです。 – malex

8

は、WWDC 2017のビデオをチェックしています

searchBar.isTranslucent = false 

ていることを確認してください:

WWDC 2017

あなたはこのような何かを行う必要があります

if #available(iOS 11.0, *) { 
      navigationItem.searchController = searchController 
      navigationItem.hidesSearchBarWhenScrolling = false 
     } else { 
      tableView.tableHeaderView = searchController.searchBar 
     } 

必要に応じて変更してください。

+0

navigationItem.searchControllerは、検索バーをタイトルの下に置きます。 – Molanda

+1

これは、iOS 11の正解です。 – benck

-1

これはあなたの問題を解決する可能性があります:

func searchDisplayController(_ controller: UISearchController, willShowSearchResultsTableView tableView: UITableView) 
{ 
    tableView.backgroundColor = self.tableView.backgroundColor 
    tableView.rowHeight = self.tableView.rowHeight 
    tableView.tableFooterView = UIView() 
} 
関連する問題