2015-04-25 14 views
13

Nella mia applicazione di chat sto usando JSQMessagesViewController per il rendering della conversazione. L'applicazione ha anche messaggi pubblici che voglio cercare. Ora sto provando a visualizzarli usando JSQMessagesViewController. Per questo voglio nascondere la barra degli strumenti di input (che funziona) e aggiungere una barra di ricerca.Come aggiungere una barra di ricerca a JSQMessagesViewController

Come si rende visibile la barra di ricerca? Quando si osserva la proprietà topContentAdditionalInset, sembra che dovrebbe essere possibile. Qui è il mio codice con i miei tentativi:

override func viewDidLoad() { 
    super.viewDidLoad() 

    self.inputToolbar.removeFromSuperview() 

    self.searchBar.removeFromSuperview() 
    self.topContentAdditionalInset = 44 
    self.searchBar.frame = CGRect(x: 0, y: 25, width: 320, height: 44) 

    // Attempt 1 
    // self.collectionView.addSubview(self.searchBar) 

    // Attempt 2 
    // self.view.addSubview(self.searchBar) 

    // Attempt 3 
    // self.navigationController?.navigationBar.addSubview(self.searchBar) 

    // Attempt 4 
    // self.inputToolbar.addSubview(self.searchBar) 

    // Attempt 5 
    self.collectionView.superview!.addSubview(self.searchBar) 
} 

Aggiornamento:

Il seguente codice sembra funzionare ragionevolmente OK. I problemi con esso sono: - È un figlio della collezioneView e quindi scorrerà con il contenuto fuori dalla vista. L'aggiunta a .superview non funziona. - scorre verso il basso di 44 pixel quando la barra di ricerca diventa attiva.

var keepRef:JSQMessagesInputToolbar! 
var searchBar:UISearchBar! 
override func viewDidAppear(animated: Bool) { 
    super.viewDidAppear(animated) 

    if self.inputToolbar.superview != nil { 
     keepRef = self.inputToolbar 
     self.inputToolbar.removeFromSuperview() 
    } 

    self.topContentAdditionalInset = 44 
    if searchBar == nil { 
     searchBar = UISearchBar(frame: CGRect(x: 0, y: -44, width: 320, height: 44)) 
     searchBar.delegate = self 
     self.collectionView.scrollsToTop = true 
     self.collectionView.addSubview(searchBar) 
    } 
    self.filterContentForSearchText("") 
} 

Aggiornamento 2:

in base alla risposta di Sergey (che funziona) ora sto usando il seguente codice:

var keepRef:JSQMessagesInputToolbar! 
var searchBar:UISearchBar! 
override func viewDidAppear(animated: Bool) { 
    super.viewDidAppear(animated) 
    self.inputToolbar.hidden = true 
    self.topContentAdditionalInset = 44 
    self.collectionView.scrollsToTop = true 
    if searchBar == nil { 
     searchBar = UISearchBar() 
     searchBar.setTranslatesAutoresizingMaskIntoConstraints(false) 
     searchBar.delegate = self 
     self.view.addSubview(searchBar) 

     let views = ["searchBar" : self.searchBar]; 
     searchBar.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("[searchBar(44)]", options: NSLayoutFormatOptions(0), metrics: nil, views: views)) 
     self.view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("|[searchBar]|", options: NSLayoutFormatOptions(0), metrics: nil, views: views)) 
     self.view.addConstraint(NSLayoutConstraint(item: searchBar, attribute: .Top, relatedBy: .Equal, toItem: self.topLayoutGuide, attribute: .Bottom, multiplier: 1.0, constant: 0.0)) 
    } 
    self.filterContentForSearchText("") 
} 
+0

Hai provato aggiungendo la barra di ricerca come intestazione della vista collezione vista? – BHendricks

risposta

10

Prima di tutto: JSQMessagesViewController sottoclasse di UIViweController. Ciò significa che puoi facilmente aggiungere sotto-visualizzazioni. Hai quasi fatto tutto correttamente in Attempt 2 ma hai impostato una cornice errata. Io suggerisco di utilizzare il layout automatico per questo, come nel codice qui sotto:

Swift

var searchBar: UISearchBar!; 

override func viewDidLoad() { 
    super.viewDidLoad() 

    searchBar = UISearchBar() 
    searchBar.setTranslatesAutoresizingMaskIntoConstraints(false) 
    self.view.addSubview(searchBar) 

    let views = ["searchBar" : self.searchBar]; 

    searchBar.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("[searchBar(44)]", options: NSLayoutFormatOptions(0), metrics: nil, views: views)) 

    self.view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("|[searchBar]|", options: NSLayoutFormatOptions(0), metrics: nil, views: views)) 

    self.view.addConstraint(NSLayoutConstraint(item: searchBar, attribute: .Top, relatedBy: .Equal, toItem: self.topLayoutGuide, attribute: .Bottom, multiplier: 1.0, constant: 0.0)) 
} 

Objective C

@property (nonatomic, strong) UISearchBar *searchBar; 
... 
// viewDidLoad 

self.searchBar = [UISearchBar new]; 
self.searchBar.translatesAutoresizingMaskIntoConstraints = NO; 
[self.view addSubview:self.searchBar]; 

NSDictionary *views = @{@"searchBar" : self.searchBar}; 

[self.searchBar addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"[searchBar(44)]" 
                     options:0 
                     metrics:nil 
                     views:views]]; 
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|[searchBar]|" 
                    options:0 
                    metrics:nil 
                    views:views]]; 
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:self.searchBar 
                 attribute:NSLayoutAttributeTop 
                 relatedBy:NSLayoutRelationEqual 
                 toItem:self.topLayoutGuide 
                 attribute:NSLayoutAttributeBottom 
                multiplier:1.0 
                 constant:0.0]]; 
+0

Grazie, ora funziona esattamente come dovrebbe. –

+0

Rompe i vincoli. – Fengson

Problemi correlati