web-dev-qa-db-fra.com

Le contenu UITableView chevauche la barre d'état lorsque UISearchBar est actif

J'ai un UITableViewController avec un UISearchBar et UISearchDisplayController. Cela existe à l'intérieur d'une vue de conteneur dans un UIViewController qui se trouve dans un UINavigationController. J'ai fait cette image pour aider à décrire la structure:

enter image description here

Voici à quoi ça ressemble vraiment:

enter image description here

Lorsque j'appuie sur la barre de recherche, je dois masquer la barre de navigation. Normalement, cela se produirait de lui-même, mais comme mon UITableViewController se trouve dans une vue de conteneur, je dois gérer ce changement moi-même. Voici à quoi cela ressemble alors, notez que la barre d'état est blanche car la barre de navigation est blanche, même si elle est masquée pour le moment.

enter image description here

Une fois que j'ai commencé à taper du texte de recherche, les résultats s'affichent. Si je fais défiler ces résultats vers le haut, ils passent sous la barre de recherche, mais ils chevauchent la barre d'état qui est très peu attrayante.

enter image description here

Si la vue Conteneur n'est pas impliquée, alors tout fonctionne comme prévu et le contenu du tableau passe sous la barre d'état, mais avec le ContainerView impliqué, le texte du tableau et la barre d'état se heurtent.

Comment faire passer le texte sous la barre d'état comme d'habitude?

31
Kenny Wyland

Je recherche cela depuis des heures et mon résultat final a été de mettre cette ligne dans viewDidLoad: self.extendedLayoutIncludesOpaqueBars = YES;

Problème résolu :)

36
nonolays

Essayez de définir le definesPresentationContext dans viewDidLoad de votre TableViewController

Swift

override func viewDidLoad() {
    super.viewDidLoad()

    definesPresentationContext = true
}

Objectif c

- (void)viewDidLoad {
    [super viewDidLoad];

    self.definesPresentationContext = YES;
}
5
warly

Voici ce qui a fonctionné pour moi:

FAIRE:

  • Utiliser UISearchController (pas un UISearchBar placé séparément)
  • Placez votre VC dans un UINavigationController s'il ne l'est pas déjà. Réglez la navigation pour ne pas "Afficher la barre de navigation" si vous le souhaitez.
  • Utilisez la mise en page automatique pour UITableView (pas les ressorts et les entretoises) et épinglez le haut de la table en haut de la vue du VC.
  • Ajoutez cette méthode déléguée:

- (UIBarPosition)positionForBar:(id<UIBarPositioning>)bar { return UIBarPositionTopAttached; }

NE PAS:

  • Violon avec bordsForExtendedLayout
  • Violon avec ExtendedLayoutIncludesOpaqueBars
  • Jouez avec le contenu de la table
4
John Scalo

J'ai UISearchBar et UISearchDisplayController.

Dans viewdidload:

self.edgesForExtendedLayout = UIRectEdgeNone;
[searchDisplayController.searchBar setBackgroundImage:[self imageWithColor:ETSBaseColor] forBarPosition:0 barMetrics:UIBarMetricsDefault];

méthode qui permet d'obtenir une image à partir d'UIColor:

- (UIImage *)imageWithColor:(UIColor *)color
{
    CGRect rect = CGRectMake(0.0f, 0.0f, 1.0f, 1.0f);
    UIGraphicsBeginImageContext(rect.size);
    CGContextRef context = UIGraphicsGetCurrentContext();

    CGContextSetFillColorWithColor(context, [color CGColor]);
    CGContextFillRect(context, rect);

    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return image;
}
3
Marlon Ruiz

Fondamentalement, cela est dû à la transparence de la barre de navigation, généralement le contrôleur de vue corrige ce chevauchement, en corrigeant les encarts supérieurs de la vue ou de la sous-vue détenues s'ils sont (ou héritent) d'UIScrollView. Vous avez 2 options, l'une consiste à définir la transparence de la barre de navigation sur non, l'autre est définie sur edgeForExtendedLayout sur aucun ou laisser uniquement en bas.

- (void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller {
    self.navigationController.navigationBar.translucent = YES;
}

- (void)searchDisplayControllerDidEndSearch:(UISearchDisplayController *)controller {
    self.navigationController.navigationBar.translucent = NO;
}

Ces conseils ne fonctionnent que sur iOS7, si vous déployez sur une vérification de cible inférieure avant de définir ces propriétés.
Une autre solution, mais je n'ai pas testé pourrait être lu le --topLayoutGuide longueur et dans -searchDisplayControllerWillBeginSearch essayez de définir un topInsets de la même longueur. De cette façon, vous devez toujours conserver la translucidité.

2
Andrea

J'ai eu le même problème:

- (void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller
{
    controller.searchBar.searchBarStyle = UISearchBarStyleDefault; // Used to cover UIStatusBar
}

- (void)searchDisplayControllerWillEndSearch:(UISearchDisplayController *)controller
{
    controller.searchBar.searchBarStyle = UISearchBarStyleMinimal; // Used not to show top and bottom separator lines
}
0
B.S.

Le hack suivant a fonctionné pour moi:

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
    return (self.searchController.isActive  && section == 0) ? 22.0f : 0.0f;
}
0
CGN

Dans mon cas, je ne veux pas masquer la barre UINavigationBar mais j'ai eu des problèmes similaires avec des ouvertures et d'autres effets secondaires. L'un d'eux était un UISearchBar manquant après le basculement entre UIViewControllers alors que le UISearchDisplayController est visible (j'utilise SWRevealViewController pour basculer entre UIViewController). Ce problème se produit uniquement sur les iPad. Il est apparu que l'UISearchBar se cache soudainement derrière l'UINavigationBar. Maintenant, j'ai résolu tous mes problèmes avec les lignes de code suivantes dans le UITableViewController qui est présenté dans un UIContainerView:

- (UINavigationController *)navigationController {
    return nil;
}

Ces lignes empêchent l'UISearchDisplayController d'atteindre et de modifier mon UINavigationController. J'ai également sous-classé cette méthode dans la classe "MyContainerTableViewController" et j'utilise cette classe maintenant pour tous les UITableViewController intégrés.

J'utilise toujours UISearchDisplayController pour prendre en charge iOS 7.

0
Raimund Wege