J'ai récemment migré du code vers le nouveau SDK iOS 11 beta 5.
J'obtiens maintenant un comportement très déroutant de UITableView. Le tableau lui-même n'est pas si sophistiqué. J'ai des cellules personnalisées, mais dans la plupart des cas, c'est juste pour leur hauteur.
Quand je pousse mon contrôleur de vue avec tableview, j'obtiens une animation supplémentaire où les cellules "défilent" (ou peut-être tout le cadre de tableview est changé) et vers le bas le long de l'animation de navigation push / pop. S'il vous plaît voir gif:
Je crée manuellement tableview
dans la loadView
méthode et configure les contraintes de mise en page automatique pour qu'elles soient égales au début, à la fin, en haut, en bas de la vue de la table. Le superview est la vue racine du contrôleur de vue.
Le code de poussée du contrôleur de vue est très standard: self.navigationController?.pushViewController(notifVC, animated: true)
Le même code fournit un comportement normal sur iOS 10.
Pourriez-vous s'il vous plaît m'indiquer ce qui ne va pas?
EDIT: J'ai fait un contrôleur tableview très simple et je peux reproduire le même comportement là-bas. Code:
class VerySimpleTableViewController : UITableViewController {
override func viewDidLoad() {
super.viewDidLoad()
self.tableView.register(UITableViewCell.self, forCellReuseIdentifier: "Cell")
}
override func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 4
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
cell.textLabel?.text = String(indexPath.row)
cell.accessoryType = .disclosureIndicator
return cell
}
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at: indexPath, animated: true)
let vc = VerySimpleTableViewController.init(style: .grouped)
self.navigationController?.pushViewController(vc, animated: true)
}
}
EDIT 2: J'ai pu réduire le problème à ma personnalisation de UINavigationBar. J'ai une personnalisation comme celle-ci:
rootNavController.navigationBar.setBackgroundImage(createFilledImage(withColor: .white, size: 1), for: .default)
où createFilledImage
crée une image carrée avec une taille et une couleur données.
Si je commente cette ligne, je retrouve un comportement normal.
J'apprécierais toute réflexion sur cette question.
navigationBar.isTranslucent
surfalse
, sinon cela fonctionne bien.Réponses:
Cela est dû à la nouvelle propriété
UIScrollView's
(UITableView est une sous-classe de UIScrollview)contentInsetAdjustmentBehavior
, qui est définie.automatic
par défaut.Vous pouvez remplacer ce comportement avec l'extrait de code suivant dans le viewDidLoad de tous les contrôleurs affectés:
https://developer.apple.com/documentation/uikit/uiscrollview/2902261-contentinsetadjustmentbehavior
la source
tableView.contentInsetAdjustmentBehavior
briserait les encarts.contentInsetAdjustmentBehavior
sur.never
n'est pas une excellente solution de contournement, car il aura probablement d'autres effets secondaires indésirables. Si vous utilisez une solution de contournement, vous devez vous assurer de la supprimer pour les versions iOS> = 11.2.En plus de la réponse de maggy
OBJECTIF C
la source
Vous pouvez modifier ce comportement à la fois dans toute l'application en utilisant NSProxy dans par exemple didFinishLaunchingWithOptions:
la source
Voici comment j'ai réussi à résoudre ce problème tout en permettant à iOS 11 de définir automatiquement des inserts . J'utilise
UITableViewController
.tableView.insetsContentViewsToSafeArea = true
) - Ce n'est peut-être pas nécessaire mais c'est ce que j'ai fait.tableView.contentInsetAdjustmentBehavior = .scrollableAxes
) -.always
peut également fonctionner, mais je n'ai pas testé.Une autre chose à essayer si tout le reste échoue:
Override
viewSafeAreaInsetsDidChange
UIViewController
pour que la vue de la table force la définition des encarts de la vue de défilement sur les encarts de la zone de sécurité. Ceci est en conjonction avec le paramètre «Jamais» dans la réponse de Maggy.Remarque:
self.tableView
etself.view
devrait être la même chose pourUITableViewController
la source
Cela ressemble plus à un bogue qu'à un comportement prévu. Cela se produit lorsque la barre de navigation n'est pas translucide ou lorsque l'image d'arrière-plan est définie.
Si vous définissez simplement contentInsetAdjustmentBehavior sur .never, les insertions de contenu ne seront pas définies correctement sur l'iPhone X, par exemple, le contenu irait dans la zone inférieure, sous les barres de défilement.
Il est nécessaire de faire deux choses:
1. empêcher scrollView de s'animer sur push / pop
2. conserver le comportement automatique car il est nécessaire pour l'iPhone X. Sans cela, par exemple en portrait, le contenu ira sous la barre de défilement inférieure.
Nouvelle solution simple: dans XIB: il suffit d'ajouter un nouveau UIView au-dessus de votre vue principale avec le dessus, le début et la fin de superview et la hauteur définie sur 0. Vous n'avez pas à le connecter à d'autres sous-vues ou quoi que ce soit.
Ancienne solution:
Remarque: Si vous utilisez UIScrollView en mode paysage, il ne définit toujours pas correctement les encarts horizontaux (un autre bogue?), Vous devez donc épingler le début / la fin de scrollView à safeAreaInsets dans IB.
Remarque 2: La solution ci-dessous pose également le problème que si tableView défile vers le bas et que vous poussez le contrôleur et que vous revenez en arrière, il ne sera plus en bas.
la source
Je peux reproduire le bogue pour iOS 11.1 mais il semble que le bogue soit corrigé depuis iOS 11.2. Voir http://openradar.appspot.com/34465226
la source
Veuillez vous assurer qu'avec le code ci-dessus, ajoutez du code supplémentaire comme suit. Cela a résolu le problème
la source
De plus, si vous utilisez la barre d'onglets, l'encart de contenu inférieur de la vue de collection sera égal à zéro. Pour cela, mettez le code ci-dessous dans viewDidAppear:
la source
Dans mon cas, cela a fonctionné (mettez-le dans viewDidLoad):
la source
Suppression d'espace supplémentaire en haut
collectionView
outableView
Au-dessus du code
collectionView
outableView
passe sous la barre de navigation.Le code ci-dessous empêche la vue de collection de passer sous la navigation
mais j'aime utiliser la logique et le code ci-dessous pour UICollectionView
Le meilleur moyen pour UICollectionView
la source
Supprimer ce code fonctionne pour moi
la source
J'utilisais UISearchController avec des resultsControllers personnalisés qui ont une vue de table. Le fait d'appuyer sur un nouveau contrôleur sur le contrôleur de résultats a entraîné la recherche de tableview.
Le code listé ci-dessus a totalement résolu le problème
la source