web-dev-qa-db-fra.com

Définir l'encart de contenu UITableView de manière permanente

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 à UISearchDisplayControlleretc. 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?

61
cojoj

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 asvi

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: enter image description here
En outre, vous pouvez obtenir la même chose dans le code:

if #available(iOS 11.0, *) {
    scrollView.contentInsetAdjustmentBehavior = .never
} else {
    automaticallyAdjustsScrollViewInsets = false
}
184
cojoj

En rapide:

override func viewDidLayoutSubviews() {
      super.viewDidLayoutSubviews()
      self.tableView.contentInset = UIEdgeInsets(top: 108, left: 0, bottom: 0, right: 0)
}
62
rmooney

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
}
7
Matan Guttman

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

4
Fran Martin

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

2
Kappe

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.

2
Pink Panther

Essayez de définir tableFooterView tableView.tableFooterView = UIView (cadre: CGRect (x: 0, y: 0, largeur: 0, hauteur: CGFloat.leastNonzeroMagnitude))

0
user3168555