8
votes

UISearchController mauvaise animation lors du balayage puis disparaissant

Pour faire court, j'ai un contrôleur de vue principal qui a la barre de navigation cachée, à partir du contrôleur de navigation de ce VC, je pousse un autre contrôleur de vue dont la barre de navigation est visible. Ensuite, j'ajoute un searchController à la navigationItem pour ajouter le searchBar lorsque je fais défiler vers le bas. Tout fonctionne bien jusqu'à ce que vous balayez vers l'arrière pour faire apparaître le VC.

La barre de navigation s'animera en laissant l'écran avec le VC, mais la barre de recherche s'animera comme si elle montait en place. Ce qui est pire, c'est que si j'annule le balayage pour faire apparaître, toute la barre de recherche disparaît et une vue noire apparaît à la place (je pense que l'arrière-plan de searchController correspond à l'arrière-plan de la vue).

J'ai tout essayé, ce sont quelques lignes de code pourtant je me tire les cheveux pour résoudre ce problème. Je sais que je peux simplement désactiver le balayage pour faire apparaître mais je ne veux pas cela (+ même en appuyant sur la barre de recherche s'anime de la même manière étrange) et je ne veux pas ajouter une barre de recherche d'une autre manière.

Dans la vidéo ci-jointe, je fais simplement glisser mon doigt pour afficher l'animation.

desc

- (void)viewDidLoad {
    [super viewDidLoad];
    self.definesPresentationContext = YES;
    [self.navigationController setNavigationBarHidden:NO];

    if (@available(iOS 11.0, *)) {
        self.searchController = [[UISearchController alloc] initWithSearchResultsController:nil];
        _searchController.delegate = self;
        _searchController.searchResultsUpdater = self;
        _searchController.searchBar.placeholder = @"Search";
        self.navigationItem.searchController = _searchController;
        self.navigationItem.hidesSearchBarWhenScrolling = YES;
    }
}

p >


6 commentaires

Montrez du code, comment vous ajoutez la barre de recherche


Bien sûr, j'ai modifié la question pour ajouter le code.


N'importe qui? N'importe quoi?


Pourriez-vous s'il vous plaît partager le code de votre projet?


@HarshalWani J'ai téléchargé un exemple de projet ici: github.com/DanielKlink/SearchbarNavigationPopIssue


Cela fonctionne maintenant correctement avec iOS 13 🙌


5 Réponses :


0
votes

L'ajout de UISearchController est une exagération, je crois. Vous pouvez toujours ajouter une UISearchbar autonome à votre contrôleur de vue via un storyboard ou un code, et faire de votre contrôleur de vue hébergeant la barre de recherche le délégué de cette barre de recherche.

Quelque chose comme ceci:

    self.searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, 0, NAVBAR_HEIGHT)];   
    self.searchBar.delegate = self;
    self.view.addSubView(self.searchBar);

De cette façon, le couplage des éléments de navigation avec la barre de recherche disparaîtra et, espérons-le, le problème sera résolu.


0 commentaires

0
votes

Placez la barre de recherche dans la vue titre de l'élément de navigation au lieu d'affecter UISearchController à UINavigationItem searchController

replace

override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        self.navigationController?.isNavigationBarHidden = true
    }

override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        self.navigationController?.isNavigationBarHidden = false
    }

avec

self.navigationController?.setNavigationBarHidden(true, animated: true)

RÉPONSE MISE À JOUR:

Le problème est dû à la méthode utilisée pour masquer NavigationBar Il existe différentes façons de masquer NavigationBar

self.navigationController?.setNavigationBarHidden(false, animated: true)
self.navigationController?.navigationBar.isHidden = false
self.navigationController?.isNavigationBarHidden = false

Et il semble que vous n'ayez utilisé que la propriété setter pour masquer sur MasterViewController p>

navigationItem.titleView = searchController?.searchBar

À la place, utilisez isNavigationBarHidden est à la fois un setter et un getter.

navigationItem.searchController

Et aussi supprimer setNavigationBarHidden de DetailViewController

Cheers !


2 commentaires

Merci pour votre réponse et c'est possible, bien sûr, mais dans mon cas, j'ai déjà un titleView personnalisé pour le navigationItem. J'ai besoin d'avoir le searchBar comme un menu déroulant. C'est pourquoi il est nécessaire de le définir sur navigationItem.searchController. La question est toujours: comment pouvons-nous éviter l'animation pop cassée et également corriger la disparition de la barre de recherche après le retour du deuxième contrôleur de vue?


SearchBar disparaît en raison de NavigationBar défini sur MasterVC. Essayez de ne pas définir NavigationBar masqué. Ça fonctionnera correctement



0
votes

J'ai essayé les réponses ici, mais aucune n'a fonctionné comme je le souhaitais. La solution suivante a fonctionné pour moi.

Pour la mauvaise animation, j'ai fait ce qui suit dans viewController avec la barre de recherche:

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

    //workaround for showing the searchbar again if popgesture was canceled
    var offset = self.tableView.contentOffset
    offset.y -= 0.5
    UIView.animate(withDuration: 0.05, animations: {
        self.tableView.setContentOffset(offset, animated: false)
    }, completion: {_ in
        offset.y += 0.5
        self.tableView.setContentOffset(offset, animated: false)
    })
}

Pour la disparition de la barre de recherche, j'ai fait défiler le tableau un peu qui laisse apparaître le searchBar. Le problème est que le searchBar est complètement supprimé de sa superView. Mais avec cette minuscule "animation" de défilement, la barre de recherche est de retour. Pas vraiment cool mais ça a marché:

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

    let containerView = transitionCoordinator?.containerView
    let currentPosition = self.navigationItem.searchController?.searchBar.superview?.frame.origin.x
    transitionCoordinator?.animateAlongsideTransition(in: containerView, animation: { (context) in
        if context.viewController(forKey: .to) is PreviousViewController {
            self.navigationItem.searchController?.searchBar.superview?.frame.origin.x = self.view.frame.size.width

        }

    }, completion: { (context) in
        self.navigationItem.searchController?.searchBar.superview?.frame.origin.x = currentPosition ?? 0
    })
}


0 commentaires

0
votes

Je pense que c'est un bogue iOS 11, 12 car il fonctionne parfaitement dans iOS 13 beta 7.


0 commentaires

0
votes

J'ai beaucoup essayé de rechercher une solution pour résoudre ce problème, et j'ai finalement trouvé cette solution,

essayez de l'utiliser:

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    navigationItem.hidesSearchBarWhenScrolling = false
}


0 commentaires