web-dev-qa-db-fra.com

Étrange comportement de décalage de la vue UISearchDisplayController dans iOS 7 lorsqu'il est incorporé dans la barre de navigation

Je construis une application iOS 7 uniquement. J'essaie de définir UISearchDisplayController dans la barre de navigation.

Je l'ai configuré comme suit: dans le storyboard, j'ai ajouté une "barre de recherche et un contrôleur d'affichage de recherche" à la vue de mon contrôleur de vue, et je l'ai défini sur (0,0) par rapport au guide de disposition supérieur. J'ai défini des contraintes pour épingler à gauche, en haut et à droite. (J'ai joué avec les contraintes, je les ai supprimées complètement, peu importe) En plus de cela, j'ai ma vue Table. Lorsque j'ai ajouté la barre de recherche à la vue du storyboard, il a automatiquement configuré les points de vente pour le délégué searchDisplayController et searchBar. Dans le code j'ai self.searchDisplayController.displaysSearchBarInNavigationBar = YES; j'ai deux problèmes:

1) Sans boutons apparaissant dans la barre de recherche (constructeur d'interface -> sélection de la barre de recherche -> options: aucune sélection), la barre de recherche se trouve au milieu de l'écran:

enter image description here

Si je clique sur la barre de navigation, il commence à modifier la barre de recherche:

enter image description here

notez également que la superposition sombre semble être décalée par rapport à la barre de navigation. Il me semble que l’espace a la même hauteur que la barre de navigation. Comme si cela avait été déplacé vers le bas. De plus, lorsqu’il affiche les résultats de la recherche, le haut de la vue du contenu est décalé du même montant (plus d’images suivent), ce qui m’amène au deuxième problème.

2) Je me suis amusé avec elle pendant un moment et j'ai décidé de cocher l'option pour qu'elle affiche le bouton d'annulation. Maintenant, la barre de recherche est correctement intégrée dans la barre de navigation, mais la superposition est toujours décalée vers le bas:

enter image description here

De nouveau, lorsque la vue du tableau des résultats de la recherche apparaît, elle est décalée du même montant (remarquez la barre de défilement à droite):

enter image description here

Encore plus curieusement, j’ai placé une bordure sur la couche vue de la table du contrôleur d’affichage de la recherche, et elle semble correcte:

enter image description here

Je n'avais jamais utilisé le contrôleur UISearchDisplayController auparavant et je ne connaissais pas comment le configurer, mais fonctionnellement, cela fonctionne bien. J'ai lu d'autres articles similaires, mais le seul conseil est de le pirater en ajustant les cadres et en réglant les décalages manuels. Je préférerais savoir ce qui cause ceci, est-ce un bug? Quelque chose que je fais mal? Si c'est un bug, je peux attendre une solution. Cela semble être une chose tellement fondamentale qu'un millier de personnes doit l'avoir fait sans problème, alors j'ai l'impression de ne pas l'avoir correctement configuré. Merci pour votre contribution.

16
d370urn3ur

Je me souviens d'avoir rencontré exactement le même problème que vous observez. Il pourrait y avoir plusieurs solutions que vous pouvez essayer.

  • Si vous utilisez des storyboards Vous devez cliquer sur le contrôleur de vue ou sur le contrôleur TableView que vous avez configuré pour votre vue de table, accéder à son inspecteur d'attributs, regarder sous ViewController et définir la section Étendre les bords à être sous Top Bars.

  • Si vous n'utilisez pas de story-boards vous pouvez définir manuellement les paramètres à l'aide de la propriété edgeForExtendedLayout de viewcontrollers. J'utilisais des storyboards.

28
hackamanshu

Dans mon cas, en utilisant des story-boards, je devais vérifier les deux Barres inférieures et Barres inférieures opaques et laisser les barres inférieures au dessous décochées.

16
Gerhat

Dans mon cas, je devais en fait désélectionner toutes les cases Extended Edges (essentiellement les mêmes que régler par défaut Extended Edges sur UIRectEdgeNone je crois) dans mon Storyboard afin d'empêcher ma barre de recherche de se décaler. Merci les gars!

3
Danchez

definePresentationContext = true

override func viewDidLoad() {
        super.viewDidLoad()

        searchController = UISearchController(searchResultsController: nil)
        searchController.searchResultsUpdater = self
        searchController.hidesNavigationBarDuringPresentation = false

        searchController.dimsBackgroundDuringPresentation = true
        searchController.searchBar.searchBarStyle = UISearchBarStyle.Prominent
        self.tableView.tableHeaderView = searchController.searchBar

        definesPresentationContext = true

ou voir UISearchBar présenté par UISearchController dans la vue d'en-tête de tableau s'anime trop lorsqu'il est actif

2
Gleb

J'avais un comportement très similaire. Pour moi, la solution consistait à décocher Étendre les bords sous la barre supérieure dans les paramètres du storyboard pour le contrôleur de vue parent (j'ai désactivé les barres de navigation transparentes, je ne suis pas sûr que cela affecte quoi que ce soit). Si vous n'utilisez pas de storyboard, vous devez définir [UIViewController edgeForExtendedLayout].

De la documentation Apple:

Cette propriété s'applique uniquement aux contrôleurs de vue intégrés dans des conteneurs, tels que UINavigationController ou UITabBarController. Les contrôleurs de vue définis en tant que contrôleur de vue racine ne réagissent pas à cette propriété. La valeur par défaut est UIRectEdgeAll.

1
Alex Sharp

J'ai eu le même problème. Et je résous ce problème en ajoutant un objet view sous la tableview.

  1. Ajouter un nouveau ViewController sur le storyboard
  2. Faites glisser TableView vers le nouveau VC
  3. Faites glisser une cellule de tableau vers la vue tableau
  4. Établissez une connexion pour TableView DataSource, délégué TableView au nouveau VC
1
dakeshi

Mon problème était juste Ajuster les inserts de vue de défilement . Après le changement en faux je n'ai pas eu de problème

1
Elano Vasconcelos
  1. Allez au storyboard.
  2. Cliquez sur le contrôleur de vue.
  3. Accédez à l'inspecteur d'attributs dans la section ViewController.
  4. Définissez la section Étendre les bords sur les barres inférieure et supérieure et sur les barres opaques.
  5. Assurez-vous de décocher les barres inférieures.
0

Malheureusement, aucune des solutions ci-dessus n'a fonctionné pour moi, j'utilise une variable UITableViewController.

Ce lien a aidé:

http://petersteinberger.com/blog/2013/fixing-uisearchdisplaycontroller-on-ios-7/

Je mets le code ci-dessous pour plus de commodité:

static UIView *PSPDFViewWithSuffix(UIView *view, NSString *classNameSuffix) {
    if (!view || classNameSuffix.length == 0) return nil;

    UIView *theView = nil;
    for (__unsafe_unretained UIView *subview in view.subviews) {
        if ([NSStringFromClass(subview.class) hasSuffix:classNameSuffix]) {
            return subview;
        }else {
            if ((theView = PSPDFViewWithSuffix(subview, classNameSuffix))) break;
        }
    }
    return theView;
}

- (void)correctSearchDisplayFrames {
    // Update search bar frame.
    CGRect superviewFrame = self.searchDisplayController.searchBar.superview.frame;
    superviewFrame.Origin.y = 0.f;
    self.searchDisplayController.searchBar.superview.frame = superviewFrame;

    // Strech dimming view.
    UIView *dimmingView = PSPDFViewWithSuffix(self.view, @"DimmingView");
    if (dimmingView) {
        CGRect dimmingFrame = dimmingView.superview.frame;
        dimmingFrame.Origin.y = self.searchDisplayController.searchBar.frame.size.height;
        dimmingFrame.size.height = self.view.frame.size.height - dimmingFrame.Origin.y;
        dimmingView.superview.frame = dimmingFrame;
    }
}

- (void)setAllViewsExceptSearchHidden:(BOOL)hidden animated:(BOOL)animated {
    [UIView animateWithDuration:animated ? 0.25f : 0.f animations:^{
        for (UIView *view in self.tableView.subviews) {
            if (view != self.searchDisplayController.searchResultsTableView &&
                view != self.searchDisplayController.searchBar) {
                view.alpha = hidden ? 0.f : 1.f;
            }
        }
    }];
}

// This fixes UISearchBarController on iOS 7. rdar://14800556
- (void)correctFramesForSearchDisplayControllerBeginSearch:(BOOL)beginSearch {
    if (PSPDFIsUIKitFlatMode()) {
        [self.navigationController setNavigationBarHidden:beginSearch animated:YES];
        dispatch_async(dispatch_get_main_queue(), ^{
            [self correctSearchDisplayFrames];
        });
        [self setAllViewsExceptSearchHidden:beginSearch animated:YES];
        [UIView animateWithDuration:0.25f animations:^{
            self.searchDisplayController.searchResultsTableView.alpha = beginSearch ? 1.f : 0.f;
        }];
    }
}

- (void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller {
    [self correctFramesForSearchDisplayControllerBeginSearch:YES];
}

- (void)searchDisplayControllerDidBeginSearch:(UISearchDisplayController *)controller {
    [self correctSearchDisplayFrames];
}

- (void)searchDisplayControllerWillEndSearch:(UISearchDisplayController *)controller {
    [self correctFramesForSearchDisplayControllerBeginSearch:NO];
}

- (void)searchDisplayController:(UISearchDisplayController *)controller didShowSearchResultsTableView:(UITableView *)tableView {
    // HACK: iOS 7 requires a cruel workaround to show the search table view.
    if (PSPDFIsUIKitFlatMode()) {
        controller.searchResultsTableView.contentInset = UIEdgeInsetsMake(self.searchDisplayController.searchBar.frame.size.height, 0.f, 0.f, 0.f);
    }
}
0
KVISH