J'ai un UIScrollView (en fait un UICollectionView, mais cela n'a probablement aucune importance). Lorsqu'il apparaît dans IOS 7, le contrôleur de navigation définit ses options contentInset et contentOffset sur des valeurs que je ne souhaite pas. Il semble essayer de s'ajuster à la barre d'état et à la barre de navigation. I ' J'ai préféré résoudre ce problème en surchargeant les méthodes getter et setter pour contentInset et contentOffset, avec un drapeau pour indiquer à l'objet s'il doit ou non accepter un ensemble. Mais existe-t-il un meilleur moyen?
Essayez de régler self.automaticallyAdjustsScrollViewInsets = NO
dans votre contrôleur de vue principal.
Ceci a été introduit dans iOS 7
donc vous voudrez peut-être encapsuler cela avec une vérification de version iOS, si vous supportez iOS 6
et plus bas.
Mise à jour
Si vous utilisez des storyboards, vous pouvez le faire dans Interface Builder et en cochant 'Adjust Scroll View Insets'
pour votre contrôleur sélectionné.
J'ai eu un problème similaire, après avoir rejeté un viewController, le contentOffset de mon tableView a été changé en (0, -64).
ma solution était un peu bizarre, j'ai essayé toutes les autres réponses mais en vain
c'était le premier contrôle dans la vue parent comme ceci:
J'ai déplacé la tableView juste après la ImageView et cela a fonctionné:
il semble que placer la vue de table dans la première position posait problème, et déplacer la vue de table à une autre position a résolu le problème.
P.D. Je n'utilise ni autoLayout ni les scénarimages
espérons que cela peut aider quelqu'un!
J'ai deux solutions:
1.
self.view = scrollView;
2.
[self.navigationController.toolbar setTranslucent:NO];
J'ai le même problème.
Réglage self.automaticallyAdjustsScrollViewInsets = NO
résolu le problème pour certaines vues mais pas partout.
La deuxième solution consiste à définir le décalage de contenu de tableview/view/scrollview dans viewWillLayoutSubviews:
- (void)viewWillLayoutSubviews {
//Arrange the view
CGRect tempViewFrame = self.view.frame;
if (tempViewFrame.Origin.y == 64.0f) {
tempViewFrame.Origin.y = 0;
self.view.frame = tempViewFrame;
}
}
C'est assez
- (void)viewDidLoad {
[super viewDidLoad];
self.automaticallyAdjustsScrollViewInsets = NO;
Cela corrige le problème dans les deux cas où:
Affichage de la barre d'état + barre de navigation
override func viewDidLayoutSubviews() {
NSLog("Origin: \(self.view.frame.Origin.y)")
if self.view.frame.Origin.y == 0 {
if let rect = self.navigationController?.navigationBar.frame {
let y = rect.size.height + rect.Origin.y
self.tableView.contentInset = UIEdgeInsetsMake(y, 0, 0, 0)
}
} else if self.view.frame.Origin.y == 44 || self.view.frame.Origin.y == 64 {
self.tableView.contentInset = UIEdgeInsetsMake(0, 0, 0, 0)
}
}
Les autres réponses peuvent marcher pour vous, mais pas pour moi. Ce qui a fonctionné pour moi a été de définir manuellement la propriété y
de contentOffset
dans viewDidLayoutSubviews
et viewWillAppear
:
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
// Set the offset to go below the status bar
collectionView.contentOffset.y = -UIApplication.shared.statusBarFrame.height
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
// Set the offset to go below the status bar
collectionView.contentOffset.y = -UIApplication.shared.statusBarFrame.height
}
Dans mon cas, mon contrôleur avait une vue de collection enfant qui parfois obtenait le contentOffset
ajusté et d'autres fois non. La façon dont je l'ai normalisé consistait simplement à l'ajuster manuellement à chaque fois. Je voulais que le contenu soit décalé en dessous de la barre d'état. J'ai donc utilisé la hauteur de la barre d'état comme valeur (négatif car je veux que le contenu soit abaissé).