web-dev-qa-db-fra.com

iOS 7 - navigationController définit les options contentInset et ContentOffset de mon UIScrollView

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?

69
William Jockusch

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é.

enter image description here

208
KDaker

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:

before

J'ai déplacé la tableView juste après la ImageView et cela a fonctionné:

after

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!

25
Chuy47

J'ai deux solutions:

1.

self.view = scrollView;

2.

[self.navigationController.toolbar setTranslucent:NO];
5
amazingthere

J'ai le même problème.

  1. Réglage self.automaticallyAdjustsScrollViewInsets = NO résolu le problème pour certaines vues mais pas partout.

  2. 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;
        }
    }
    
2
Savvy iPhone

C'est assez

- (void)viewDidLoad {

    [super viewDidLoad];

    self.automaticallyAdjustsScrollViewInsets = NO;
0
Vlad

Cela corrige le problème dans les deux cas où:

  1. Affichage de la barre d'état
  2. 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é).

0
Eric F.