Dans mon application, j'ai un UISearchBar
sous UINavigationBar
donc il est toujours visible pour l'utilisateur. Dans ce cas, je devais définir contentInset
avec un supplément de 44 pixels pour que UIScrollView
défile sous UISearchBar
(exactement comme dans Contacts.app). Et il n'y aurait pas de problème avec les UITableView
statiques, mais dans mon cas, je dois recharger son contenu, passer à UISearchDisplayController
etc. Alors quand j'appelle:
[self.tableView setContentInset:UIEdgeInsetsMake(108, 0, 0, 0)];
Tout fonctionne jusqu'à ce que, par exemple, Je tire pour rafraîchir ... (pour cela j'utilise SSPullToRefresh
).
Ma question est donc la suivante: Comment puis-je définir contentInset
de manière permanente afin de ne pas avoir à m'inquiéter des modifications éventuelles des données à l'intérieur de UITableView
?
C’était probablement une erreur de ma part parce que j’ai joué avec les autolayouts et les story-boards, mais j’ai trouvé une réponse.
Vous devez prendre soin de ce petit gars dans Inspecteur d'attributs de vue du contrôleur de vue
Il doit être décoché pour que la valeur par défaut contentInset
ne soit pas définie après toute modification. Après cela, il suffit d'ajouter one-liner à viewDidLoad
:
[self.tableView setContentInset:UIEdgeInsetsMake(108, 0, 0, 0)]; // 108 is only example
iOS 11, mise à jour de Xcode 9
On dirait que la solution précédente n’est plus une solution correcte s’il s’agit de iOS 11 et de Xcode 9 . automaticallyAdjustsScrollViewInsets
est obsolète et pour obtenir un effet similaire, vous devez maintenant accéder à Inspecteur de taille où vous pouvez trouver ceci:
En outre, vous pouvez obtenir la même chose dans le code:
if #available(iOS 11.0, *) {
scrollView.contentInsetAdjustmentBehavior = .never
} else {
automaticallyAdjustsScrollViewInsets = false
}
En rapide:
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
self.tableView.contentInset = UIEdgeInsets(top: 108, left: 0, bottom: 0, right: 0)
}
automatiquementAdjustsScrollViewInsets est obsolète dans iOS11 (et la solution acceptée ne fonctionne plus). utilisation:
if #available(iOS 11.0, *) {
scrollView.contentInsetAdjustmentBehavior = .never
} else {
automaticallyAdjustsScrollViewInsets = false
}
Ajoutez dans numberOfRowsInSection votre code [self.tableView setContentInset:UIEdgeInsetsMake(108, 0, 0, 0)];
. Donc, vous définissez votre contentInset toujours vous rechargez des données dans votre table
Après une heure de tests, la seule façon de fonctionner à 100% est la suivante:
-(void)hideSearchBar
{
if([self.tableSearchBar.text length]<=0 && !self.tableSearchBar.isFirstResponder)
{
self.tableView.contentOffset = CGPointMake(0, self.tableSearchBar.bounds.size.height);
self.edgesForExtendedLayout = UIRectEdgeBottom;
}
}
-(void)viewDidLayoutSubviews
{
[self hideSearchBar];
}
avec cette approche, vous pouvez toujours masquer la barre de recherche si est vide
Voici comment le réparer facilement via Storyboard (iOS 11 et Xcode 9.1):
Sélectionnez Vue Tableau> Inspecteur de taille> Encarts de contenu: jamais.
Essayez de définir tableFooterView tableView.tableFooterView = UIView (cadre: CGRect (x: 0, y: 0, largeur: 0, hauteur: CGFloat.leastNonzeroMagnitude))