2017-09-19 25 views
8

Gezinme öğesine yeni arama yolu ekleme konusunda bir sorun yaşıyorum.Broken UISearchBar animasyonu navigationItem'e gömülü

Aşağıdaki resimde de gördüğünüz gibi, birbiri ardına iki UIViewControler var ve her ikisi de arama çubuğuna sahip. Sorun, arama çubuğu ilk görüntü denetleyicide göründüğünde çirkin olan, ancak ikincisindeki değil, çirkin olan animasyon. Arama çubuğu tarafından işgal edilen alan ekranda kalır ve aniden kaybolur.

Demo

kod çok temel (projede başka değişiklik yapılmıştır) olduğu:

(C# öncelikle yazmak, bu nedenle bu kodda hata olabilir.)

ViewController.swift:

import UIKit 

class ViewController: UITableViewController, UISearchResultsUpdating { 

override func loadView() { 
    super.loadView() 

    definesPresentationContext = true; 

    navigationController?.navigationBar.prefersLargeTitles = true; 
    navigationItem.largeTitleDisplayMode = .automatic; 
    navigationItem.title = "VC" 

    tableView.insetsContentViewsToSafeArea = true; 
    tableView.dataSource = self; 

    refreshControl = UIRefreshControl(); 
    refreshControl?.addTarget(self, action: #selector(ViewController.handleRefresh(_:)), for: UIControlEvents.valueChanged) 
    tableView.refreshControl = refreshControl; 

    let stvc = UITableViewController(); 
    stvc.tableView.dataSource = self; 

    let sc = UISearchController(searchResultsController: stvc); 
    sc.searchResultsUpdater = self; 
    navigationItem.searchController = sc; 
} 

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    var cell = tableView.dequeueReusableCell(withIdentifier: "cell1"); 
    if (cell == nil) { 
     cell = UITableViewCell(style: .default, reuseIdentifier: "cell1"); 
    } 
    cell?.textLabel?.text = "cell " + String(indexPath.row); 
    return cell!; 
} 

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return 20; 
} 

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
    let vc = ViewController(); 
    navigationController?.pushViewController(vc, animated: true); 
} 

@objc func handleRefresh(_ refreshControl: UIRefreshControl) { 
    DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(2), execute: { 
     refreshControl.endRefreshing(); 
    }) 
} 

func updateSearchResults(for searchController: UISearchController) { 
} 
} 

AppDelegate.swift:

import UIKit 

@UIApplicationMain 
class AppDelegate: UIResponder, UIApplicationDelegate { 

var window: UIWindow? 

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 

    window = UIWindow(frame: UIScreen.main.bounds); 
    window?.rootViewController = UINavigationController(rootViewController: ViewController()); 
    window?.makeKeyAndVisible(); 

    UINavigationBar.appearance().barTintColor = UIColor.red; 

    return true 
} 
} 

Fikirler?

+0

Aygıtta kontrol edin. Simülatör sorunu olabilir. ViewDidLoad() 'ile deneyin (loadView()) – Krunal

+0

Nope yerine, cihazda aynıdır. – BartoszCichecki

+0

Ve viewDidLoad aynı sonucu veriyor. – BartoszCichecki

cevap

4

Apple'ın yeni büyük başlık stilinde UISearchBar kullanımını devre dışı bırakması gerekiyor gibi görünüyor. UIViewController'a basarsanız, navigationItem.searchController setine sahip değilseniz, animasyon iyi çalışır. Her ikisi de bir searchController setine sahip olan iki örnekte UIViewController arasında gezinirken, gezinti çubuğunun yüksekliğinin atladığı yeri açıkladığınız sorunu alırsınız.

Her zaman viewDidAppear çağrılan UISearchController yaratma (yerine loadView bunu oluşturma) ve viewDidDisappear üzerine nil navigationItem.searchController ayarlayarak (etrafında işi) sorunu çözebilir.

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Only one palette with a top boundary edge can be active outside of a transition. Current active palette is <_UINavigationControllerManagedSearchPalette: 0x7fad67117e80; frame = (0 116; 414 0); layer = <CALayer: 0x60400002c8e0>>' 

Bunun etrafında sadece bir eser olduğunu biliyorum ama umarım bu irade: viewDidAppear yöntemde navigationItem.searchController inline ayarlarken

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

    DispatchQueue.main.async { 
     let stvc = UITableViewController() 
     stvc.tableView.dataSource = self 

     let sc = UISearchController(searchResultsController: stvc) 
     sc.searchResultsUpdater = self 
     self.navigationItem.searchController = sc 
    } 
} 

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

    self.navigationItem.searchController = nil 
} 

asenkron sevk nedeni, bir özel duruma neden olduğunu Apple'ın, her ikisi de navigationItem ayarlarında bulunan UISearchController numaralı iki görünüm denetleyicisi arasında gezinerek sorunu çözmesine yardımcı olana dek size yardımcı olun.

+1

iOS 11 ... güzel özledim Apple .. –