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:
Voici à quoi ça ressemble vraiment:
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.
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.
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?
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 :)
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;
}
Voici ce qui a fonctionné pour moi:
FAIRE:
- (UIBarPosition)positionForBar:(id<UIBarPositioning>)bar { return UIBarPositionTopAttached; }
NE PAS:
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;
}
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é.
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
}
Le hack suivant a fonctionné pour moi:
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
return (self.searchController.isActive && section == 0) ? 22.0f : 0.0f;
}
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.