2017-07-20 3 views
0

Ma cellule de collection personnalisée contient WKWebView. Et je veux faire la taille de la cellule automatiquement à la taille de mon WKWebView. Mais toutes mes tentatives pour activer les cellules auto dimensionnement, a échoué :(Vue de la présentation Mise en page La taille automatique ne fonctionne pas

Dans mon contrôleur je fais:

var p = self.htmlNotificationsCollectionView.collectionViewLayout as? NSCollectionViewFlowLayout 
p?.estimatedItemSize = CGSize(width: self.htmlNotificationsCollectionView.frame.width, height: 120) 

Comme la documentation écriture devrait alors déclencher la méthode preferredLayoutAttributesFitting:

class HTMLNotificationCollectionViewItem: NSCollectionViewItem, WKNavigationDelegate { 
    override func preferredLayoutAttributesFitting(_ layoutAttributes: NSCollectionViewLayoutAttributes) -> NSCollectionViewLayoutAttributes { 
     print("got it") 
    } 
} 

Mais rien ne fonctionne , méthode n'a pas appelé et mes cellules ont une hauteur fixe = 120

J'ai également essayé:

class HorizontallyFlushCollectionViewFlowLayout: NSCollectionViewFlowLayout { 

    override func layoutAttributesForItem(at indexPath: IndexPath) -> NSCollectionViewLayoutAttributes? { 
     let attributes = super.layoutAttributesForItem(at: indexPath)?.copy() as? NSCollectionViewLayoutAttributes 
     guard let collectionView = collectionView else { return attributes } 
     attributes?.frame.size.width = collectionView.frame.width - sectionInset.left - sectionInset.right 
     return attributes 

    } 

    override func layoutAttributesForElements(in rect: CGRect) -> [NSCollectionViewLayoutAttributes] { 
     let allAttributes = super.layoutAttributesForElements(in: rect) 
     return allAttributes.flatMap { attributes in 
      switch attributes.representedElementCategory { 
      case .item: return layoutAttributesForItem(at: attributes.indexPath!) 
      default: return attributes 
      } 
     } 
    } 
} 

Mais mon preferredLayoutAttributesFitting au point ne fonctionne toujours pas appeler:

override func preferredLayoutAttributesFitting(_ layoutAttributes: NSCollectionViewLayoutAttributes) -> NSCollectionViewLayoutAttributes { 
     print("DSADASDADASD") 
     return layoutAttributes 
    } 

projet de test Ajouté:

https://github.com/Arti3DPlayer/SCollectionViewTests

enter image description here

+0

vous attendez-vous à la cellule autoSize à la hauteur du _contents_ du WebView? – bjtitus

+0

oui, et d'abord je veux commencer avec la hauteur de la cellule, puis la hauteur de webview. Ou vous avez une solution? – Arti

+0

Les vues Web ne se redimensionnent pas. Vous devez obtenir la hauteur du contenu dans la vue Web et définir la hauteur de la vue Web en fonction de cela. https://stackoverflow.com/questions/13858290/ios-resize-uiwebview-after-didfinishload-content-should-fit-without-scrolling – bjtitus

Répondre

1

Comme la documentation écriture alors devrait déclencher preferredLayoutAttributesFitting méthode

Documentation pour cette méthode a également une section Considérations particulières, qui says:

Dans OS X 10.11, cette méthode est jamais appelée.

Si vous souhaitez personnaliser la taille de chaque élément, utilisez collectionView(_:layout:sizeForItemAt:) méthode de NSCollectionViewDelegateFlowLayout protocole à la place:

extension ViewController : NSCollectionViewDelegateFlowLayout { 
    func collectionView(_ collectionView: NSCollectionView, 
         layout collectionViewLayout: NSCollectionViewLayout, 
         sizeForItemAt indexPath: IndexPath) -> NSSize { 
     return NSSize(width: self.myCollectionView.bounds.width, height: 180) 
    } 
} 
+1

J'ai besoin de hauteur personnalisée en fonction de la hauteur de la cellule – Arti

+0

@Atri Il simule comme Apple n'a pas implémenté les méthodes optionnelles du protocole 'NSCollectionViewDelegateFlowLayout' dans NSCollectionViewItem. Et s'ils disent que vous avez besoin d'appeler 'preferredLayoutAttributesFitting' d'un parent - il n'y a pas de telle méthode (vérifiée sous l'objectif-c runtime sur macOS 10.12.5). Pourquoi vous ne pouvez pas stocker la taille de l'élément séparément dans votre modèle et utiliser l'API 'NSCollectionViewDelegateFlowLayout'? – toma

+0

mais si ma cellule redimensionne automatiquement à chaque fois? – Arti