2017-10-10 4 views
0

Dans mon application iOS rapide, j'ai créé UIColletctionViewController avec UICollectionViewLayout personnalisé qui crée une disposition de grille parent-enfant défilante horizontalement. La hauteur de cette disposition est calculée de manière à correspondre à la hauteur de l'écran.Shrink Collection Afficher lorsque la barre de navigation a été ajoutée

override var collectionViewContentSize: CGSize { 
    return CGSize(
     width: someWidth, 
     height: collectionView?.frame.height ?? 0 
    ) 
} 

Lorsque j'intégrer mon contrôleur de vue collection en toute vue collection de la barre de navigation est déplacé vers le bas, mais collectionView?.frame.height reste le même si mon contenu déborde vers le bas.

enter image description here

Comment puis-je obtenir la hauteur de ce qui a réduit l'espace utilisable sans barre de navigation?

+0

Essayez d'invalider la mise en page CollectionView lorsque le changement d'image de vue. – IlNero

+0

Malheureusement, cela n'aide pas. – Peracek

Répondre

0

En fait, j'ai trouvé une solution très facile qui fonctionne pour moi. J'ai désélectionné l'option "Under Top Bars" dans l'inspecteur Attributes de mon contrôleur de vue de collection.

UICollectionViewController

1

Si votre contrôleur de vue fixe edgesForExtendedLayout-.all ou .top et automaticallyAdjustsScrollViewInsets = true (qui ressemble à c'est le cas), votre contentInset de CollectionView obtient ajustée pour compenser la hauteur de la barre de navigation, afin de vérifier à cet encart.

En supposant que votre CollectionView étend vers le haut (commence derrière la barre de navigation) obtenir la hauteur visible:

let visibleHeight = collectionView.frame.height - collectionView.contentInset.top 

Dans votre cas, vous pouvez faire:

override var collectionViewContentSize: CGSize { 
    return CGSize(
     width: someWidth, 
     height: collectionView.frame.height - collectionView.contentInset.top 
    ) 
} 

Une autre option est de mettre edgesForExtendedLayout = UIRectEdge(rawValue: UInt(0)) alors votre La vue du contrôleur de vue ne s'étendra pas à l'une ou l'autre bord et apparaîtra en dessous de la barre de navigation, ainsi l'image de votre vue de collection sera dans les limites visibles et vous pouvez utiliser le collectionViewContentSize comme dans votre exemple.

+0

Mon 'collectionView.contentInset.top' est mis à zéro donc cela ne fonctionne pas. Mais cette seconde solution avec la définition de 'edgesForExtendedLayout = UIRectEdge (rawValue: UInt (0))' fonctionne. Merci! – Peracek

+0

Génial. Ensuite, vous pouvez le vérifier comme réponse :) –

+0

@Peracek btw, pour l'autre solution, vérifiez 'collectionView.contentInset.top' dans' viewWillAppear' ou 'viewWillLayoutSubviews', car les encarts ne sont pas encore ajustés dans' viewDidLoad'. –