iOS 13 celah pengontrol pencarian yang aneh

Saat menjalankan Aplikasi di iOS 13 beta 6, menggunakan Xcode 11 beta 5 Saya menemukan celah aneh saat menyajikan pengontrol tampilan hasil pencarian:

masukkan deskripsi gambar di sini

Berikut sedikit cara pengaturannya:

let searchResultsController = BLSearchResultsController()

let ret = UISearchController(searchResultsController: searchResultsController)
ret.searchResultsUpdater = self
ret.delegate = self
ret.searchBar.delegate = self;
ret.searchBar.autocapitalizationType = .none
ret.searchBar.placeholder = NSLocalizedString("SearchMsg", comment: "")
        ret.searchBar.enablesReturnKeyAutomatically = true

if #available(iOS 13.0, *) {
    ret.searchBar.showsScopeBar = false
    ret.searchBar.backgroundColor = .white

    let searchTextField = ret.searchBar.searchTextField
    searchTextField.font = UIFont.tuttiRegularFont(16)
    searchTextField.accessibilityIdentifier = "Main Search Field"
    if let searchImageView = searchTextField.leftView as? UIImageView {
        searchImageView.image = UIImage(named: "home-search-icon")
     }
}

Pengontrol pencarian hasil adalah UITableViewController normal dan baru saja ditambahkan ke navigationItem.searchController. Tidak ada kode presentasi yang mewah. Saat membangun Xcode langsung terbaru dan berjalan di perangkat iOS 11/12, masalah ini tidak muncul sehingga membuat saya percaya bahwa beberapa perubahan mendasar pada iOS 13 mungkin menyebabkan kesalahan ini.

Saat men-debug hierarki tampilan, sepertinya pengontrol tampilan hasil tidak mencapai bagian atas bilah penelusuran yang dipindahkan.

Saya sudah mencoba mengutak-atik modalPresentationModes mencoba mengecualikan kemungkinan bahwa perubahan pada presentasi bisa menjadi penyebabnya, tidak berhasil.

Adakah yang pernah mengalami masalah ini dan beruntung memperbaikinya?


person UrosMi    schedule 16.08.2019    source sumber
comment
Kemungkinan duplikat bilah pencarian UISearchController di header tampilan tabel hilang celah ukuran bilah status   -  person mmika1000    schedule 16.08.2019
comment
sayangnya saya tidak memiliki kontrol segmen atau apa pun. Pengontrol pencarian saya baru saja tertanam di navigationItem.searchController. Saya pikir ini dalam konteks beberapa perubahan mendasar pada iOS 13, karena ini tidak terjadi ketika menjalankan Xcode saat ini dengan versi iOS saat ini.   -  person UrosMi    schedule 16.08.2019
comment
masih memeriksa ulang dan tidak ada jawaban yang membantu   -  person UrosMi    schedule 16.08.2019
comment
Saya juga mengalami masalah ini dan tidak yakin apa penyebabnya.   -  person SlashDevSlashGnoll    schedule 26.08.2019
comment
Saya memiliki masalah yang sama, bahkan dalam versi yang sudah ada yang dibuat dengan Xcode 10.3 di iOS 13   -  person Igor Kulman    schedule 05.09.2019
comment
Maaf menambahkan saya juga tapi... saya juga.   -  person Nostradamus    schedule 17.09.2019
comment
Hai teman, apakah Anda menemukan solusinya   -  person Swift Sharp    schedule 03.10.2019
comment
Tidak ada yang tidak hackish @SwiftSharp...saat ini menghapus UISearchController sepertinya satu-satunya solusi yang baik   -  person UrosMi    schedule 07.10.2019


Jawaban (12)


Pengaturan

extendedLayoutIncludesOpaqueBars = true

di UIViewController yang digunakan untuk menampilkan hasil pencarian, perbaiki masalah saya.

person DrS    schedule 29.08.2019

Kami memiliki masalah yang sama dan solusinya adalah menyetel Di Bawah Bilah Buram (karena kami menggunakan bilah buram) Di Bawah Batang Buram

Kami sudah mencentang Atas dan Bawah, menambahkan yang ketiga memindahkan pengontrol hasil pencarian ke lokasi yang benar.

person TodayMorning    schedule 29.08.2019
comment
ya, saya sudah mencobanya tetapi tidak berhasil... Harus melakukannya melalui kode karena proyek ini menggunakan .xibs jadi saya melakukannya searchResultsController.extendedLayoutIncludesOpaqueBars = true searchResultsController.edgesForExtendedLayout = .all - person UrosMi; 29.08.2019
comment
Saya harus mengaturnya di viewcontroller yang menampung searchcontroller, bukan di searchcontroller itu sendiri - person Hons; 23.09.2019
comment
Ini meninggalkan celah aneh di atas bilah navigasi saya. Saya harus menggunakan jawaban @mirkobraic. Meski kelihatannya jelek - person PJayRushton; 31.10.2019

Bagi saya masalahnya adalah UISearchController tidak memperbarui bingkainya ketika bilah pencarian dipindahkan ke atas. Saya memperbaikinya dengan mengatur bingkai UISearchController ke bingkai pengontrol tampilan yang disajikan.

extension UISearchController {
    open override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        if let presentingVC = self.presentingViewController {
            DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
                self.view.frame = presentingVC.view.frame
            }
        }
    }
}

Dalam viewWillAppear, animasi bilah pencarian tidak dimulai sehingga Anda harus menunggu sepersekian detik. Saat animasi dimulai, bingkai penyajian VC disetel ke nilai yang benar dan kemudian Anda dapat memperbarui bingkai UISearchController Anda. Solusinya adalah peretasan tetapi berfungsi dengan baik untuk saya.

person mirkobraic    schedule 24.10.2019
comment
Saya benar-benar melewatkan jawaban ini dan mencoba jawaban lainnya. Akhirnya kembali ke sini 2 jam kemudian sebagai upaya terakhir. Sayangnya itu berhasil. Apa yang akan terjadi di dunia ini?! - person PJayRushton; 31.10.2019

Akhirnya bisa melewati masa sulit. Hanya untuk membuat pengontrol pertama berisi UISearchController yang memiliki bilah navigasi tembus pandang. Bekerja untuk saya dengan sempurna!

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)

        self.navigationController?.navigationBar.isTranslucent = true
    }

    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillAppear(animated)

        self.navigationController?.navigationBar.isTranslucent = false
    }
person Raydemo    schedule 23.09.2019
comment
Di sini pengaturan isTrunslucent ke nilai sebenarnya memainkan peran penting agar bilah pencarian pengontrol pencarian tidak semuanya berwarna hitam. Tapi tahu mengapa itu perlu diatur. Agak berlawanan dengan intuisi mengapa menyetel bilah navigasi menjadi tembus pandang membuatnya tidak menjadi hitam (transparan?) - person MichaƂ Ziobro; 24.09.2019

extendedLayoutIncludesOpaqueBars = true memang membantu sampai batas tertentu.

Bersamaan dengan ini, saya harus memperbarui

navigationController?.navigationBar.prefersLargeTitles = false

saat kami mulai mencari dan menyetelnya kembali ke true saat bilah pencarian ditutup.

person Baby Groot    schedule 11.09.2019
comment
melakukan hal serupa untuk saat ini :( - person UrosMi; 23.09.2019

FYI Saya mengajukan laporan bug ke Apple - menurut presentasi WWDC yang menjelaskan versi baru -SearchController yang ditulis dan beberapa pembaruan UI lainnya, sepertinya arsitektur SearchController telah ditulis ulang dari awal. Saya tidak percaya bahwa kesenjangan yang kita lihat ini adalah perilaku yang diharapkan - Saya telah menyia-nyiakan waktu dua hari untuk mencoba melewati hal ini, dan ternyata tidak. mengganggu lebih jauh - aplikasi toko aplikasi saya adalah aplikasi gratis yang memiliki sejumlah pengguna dan saya tidak dapat meluangkan waktu untuk melacak perubahan/perilaku di API selama periode beta, saya agak bosan dengan Apple yang melakukan hal semacam ini hal setiap tahunnya.

person Nostradamus    schedule 22.09.2019

  1. Seperti disebutkan dalam jawaban di atas, setel bendera Perluas Tepi Di Bawah Bilah Buram sebagai Aktif untuk UIViewController yang menyajikan hasil pencarian. Bagi saya itu tidak cukup karena saya menggunakan bilah navigasi yang TIDAK tembus cahaya.
  2. Jadi saya menambahkan implementasi berikut untuk metode UISearchControllerDelegate:
    - (void)willPresentSearchController:(UISearchController *)searchController
    {
        if (@available(iOS 13.0, *))
        {
            self.navigationController.navigationBar.translucent = YES;
        }
    }

    - (void)willDismissSearchController:(UISearchController *)searchController
    {
        if (@available(iOS 13.0, *))
        {
            self.navigationController.navigationBar.translucent = NO;
        }
    }
person Alexander Survillo    schedule 09.10.2019
comment
stackoverflow.com/questions/58427943/ Bisakah Anda memeriksa ini. Saya memiliki masalah yang sama tetapi tidak ada solusi yang berhasil untuk saya - person Yogesh Patel; 25.10.2019

Menggunakan .asyncAfter(deadline: .now() + 0.1) akan menyebabkan kesalahan pada UI. Untuk menghilangkannya, hilangkan tenggat waktu! Menggunakan DispatchQueue.main.async sudah cukup.

extension UISearchController {
    open override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        if let presentingVC = self.presentingViewController {
            DispatchQueue.main.async {
                self.view.frame = presentingVC.view.frame
            }
        }
    }
}
person Tiziano Coroneo    schedule 31.10.2019

Solusi termudah adalah dengan mengatur ini di searchResultsController Anda:

searchResultsController.edgesForExtendedLayout = UIRectEdgeNone;
person Bms270    schedule 04.06.2020

Anda harus menyetel NavigationBar.standardAppearance milik Anda ke objek UINavigationBarAppearance yang menjelaskan latar belakang putih.

if #available(iOS 13.0, *) {
        let appearance = UINavigationBarAppearance()
        appearance.backgroundColor = .white
        self.navigationController?.navigationBar.standardAppearance = appearance
}
person user3187971    schedule 18.09.2019

Saya akhirnya menyelesaikan ini dengan mengganti UISearchController dengan UISearchBar sederhana.

Mungkin bukan jawaban yang ingin Anda dengar, tetapi UISsearchController sudah berantakan di iOS12, kode yang sama di iOS13 berfungsi tetapi memberikan artefak UI yang buruk. Seperti bilah pencarian yang menghilang atau tumpang tindih dengan header, spasi antara bilah pencarian dan elemen pertama tabel, atau menyembunyikan item daftar pertama di bawah tombol cakupan, ... Semua masalah berbeda antara iOS12 dan 13, tetapi tidak pernah terlihat bagus.

Jadi secara keseluruhan saya menghabiskan 6 jam mencoba memperbaiki pengontrol pencarian, gagal, kemudian menghabiskan 30 menit untuk bermigrasi ke Searchbar.

Saya menambahkan UISearchBar hanya menggunakan Interface Builder di Xcode10.3. Untuk pemfaktoran ulang, sebagian besar saya harus mengganti searchController.searchBar.xx dengan searchBar.xx . Upaya utamanya adalah menerapkan kembali UISeachBarDelegates. Hanya untuk menampilkan tombol cakupan dan tombol batal saat pengguna mencari, dan menghapusnya setelahnya. Kode di bawah ini memberikan gambaran bagus tentang apa yang saya lakukan:

class MasterViewController: UITableViewController, NSFetchedResultsControllerDelegate {

  var fetchedItemsController: NSFetchedResultsController<Item>! = NSFetchedResultsController()

  @IBOutlet weak var searchBar: UISearchBar! //hooked up to IB
  //GONE IS: let searchController = UISearchController(searchResultsController: nil)


  override func viewDidLoad() {
    super.viewDidLoad()

    initializeFetchedResultsControllerForItems()

    //Enable search controller
    searchBar.scopeButtonTitles = [NSLocalizedString("Name", comment: ""),
                                   NSLocalizedString("Birthdate", comment: ""),
                                   NSLocalizedString("Employer", comment: "")    ]
    searchBar.placeholder = NSLocalizedString("Search", comment: "")
    searchBar.delegate = self
    searchBar.showsScopeBar = false
    searchBar.showsCancelButton = false

    tableView.contentInsetAdjustmentBehavior = .automatic
    self.tableView.tableHeaderView = searchBar //add the searchbar as tableheader view

    self.initializeFetchedResultsControllerForItems()

  }

  // MARK: - Data loading from CoreData
  private func initializeFetchedResultsControllerForItems(searchText: String = "", scopeIndex: Int = 0) {
    //print("FETCH RESULTS WITH FILTER: \(searchText) en SCOPE: \(scopeIndex)")
    //Do whatever searches you need to do to update the FetchedResultsController
    //..
    self.tableView.reloadData()
  }
}

extension MasterViewController: UISearchBarDelegate {  //the delegates for the searchbar
  func searchBarTextDidBeginEditing(_ searchBar: UISearchBar) {
    searchBar.showsScopeBar = true  //show the scopebar when users adds text to searchbar
    searchBar.showsCancelButton = true //also show the cancel button
    searchBar.sizeToFit()
    self.tableView.reloadData() //since the scopebar is there, the table needs to move a bit down

  }
  func searchBarTextDidEndEditing(_ searchBar: UISearchBar) {
  }
  func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
    initializeFetchedResultsControllerForItems(searchText: searchBar.text!, scopeIndex: searchBar.selectedScopeButtonIndex)
  }
  func searchBar(_ searchBar: UISearchBar, selectedScopeButtonIndexDidChange selectedScope: Int) {
    switch (selectedScope) {
    case 0: searchBar.placeholder = NSLocalizedString("Seach on name", comment: "")
    case 1: searchBar.placeholder = NSLocalizedString("Search on birthdate", comment: "")
    case 2: searchBar.placeholder = NSLocalizedString("Search on employer", comment: "")
    default: searchBar.placeholder = NSLocalizedString("Search", comment: "")

    searchBar.showsScopeBar = true
    searchBar.sizeToFit()
    }

    initializeFetchedResultsControllerForItems(searchText: searchBar.text!, scopeIndex: selectedScope)
  }
  func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
    searchBar.placeholder = NSLocalizedString("Search", comment: "")
    searchBar.showsScopeBar = false
    searchBar.showsCancelButton = false
    searchBar.endEditing(true)
    searchBar.text = ""
    searchBar.sizeToFit()
    initializeFetchedResultsControllerForItems(searchText: searchBar.text!, scopeIndex: searchBar.selectedScopeButtonIndex)
  }
}
person Rodge    schedule 01.10.2019
comment
Yup, saya juga sedang berpikir untuk memfaktorkan ulang uisearchviewcontroller - person UrosMi; 01.10.2019

Hanya membawa solusi saya. Dalam hal ini:

edgesForExtendedLayout = .all

pada UIViewController yang berisi UISearchController berfungsi.

//MARK: - Properties
var presenter: ExplorePresenting?
var searchController: UISearchController?
var searchUpdater: SearchUpdating?


//MARK: - Lifecycle methods
public override func viewDidLoad() {
    super.viewDidLoad()

    headerTitle = "explore".localised
    tableView.allowsSelection = false
    registerCell(cellClass: ExploreTableViewCell.self, with: tableView)

    if let searchController = searchController {

        searchController.searchBar.delegate = self
        searchController.searchResultsUpdater = self
        searchController.obscuresBackgroundDuringPresentation = false
        searchController.searchBar.placeholder = "explore_search_placeholder".localised

        definesPresentationContext = true
        navigationItem.hidesSearchBarWhenScrolling = false
        navigationItem.searchController = searchController
        edgesForExtendedLayout = .all

    }

    presenter?.viewReady()

}
person Reimond Hill    schedule 10.10.2019