集合视图布局自身尺寸不起作用

时间:2017-07-20 15:36:22

标签: ios swift macos cocoa nscollectionview

我的自定义收藏单元格包含WKWebView。我希望自动将单元格高度调整为WKWebView的大小。但是我试图开启自我调整细胞的尝试都失败了:(

在我的控制器中我做:

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

当文档写入时,应该触发preferredLayoutAttributesFitting方法:

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

但没有任何作用,方法没有调用,我的细胞有固定的高度= 120

我也试过了:

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
            }
        }
    }
}

但是我的preferredLayoutAttributesFitting项仍然没有打电话:

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

添加了测试项目:

https://github.com/Arti3DPlayer/SCollectionViewTests

enter image description here

1 个答案:

答案 0 :(得分:1)

  

随着文档编写,应该触发   preferredLayoutAttributesFitting方法

此方法的文档还有一个特殊注意事项部分,says

  

在OS X 10.11中,永远不会调用此方法。

如果您想自定义每个项目的尺寸,请使用NSCollectionViewDelegateFlowLayout协议的collectionView(_:layout:sizeForItemAt:)方法:

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