Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift NSCollectionView自定义布局异常行为_Swift_Macos_Collectionview - Fatal编程技术网

Swift NSCollectionView自定义布局异常行为

Swift NSCollectionView自定义布局异常行为,swift,macos,collectionview,Swift,Macos,Collectionview,我正在macOS上的NSCollectionView中试验我自己的自定义布局。每当我运行我的应用程序时,我得到的布局肯定不是我所计算的(通过大量调用print())验证了这一点)。细胞向下移动了一些看似任意的量 但是,当我加宽窗口时,集合视图会自动更正自身,并且布局符合我的预期。请参见gif演示和我的自定义布局代码。发生了什么事 [更新]-我已确定问题的部分原因是我的项目视图具有自动调整大小的遮罩,并且这些布局约束在视图加宽之前不会得到修改。但为什么会这样呢?NSCollectionView不应

我正在macOS上的NSCollectionView中试验我自己的自定义布局。每当我运行我的应用程序时,我得到的布局肯定不是我所计算的(通过大量调用
print()
)验证了这一点)。细胞向下移动了一些看似任意的量

但是,当我加宽窗口时,集合视图会自动更正自身,并且布局符合我的预期。请参见gif演示和我的自定义布局代码。发生了什么事

[更新]-我已确定问题的部分原因是我的项目视图具有自动调整大小的遮罩,并且这些布局约束在视图加宽之前不会得到修改。但为什么会这样呢?
NSCollectionView
不应该遵循我在自定义布局中给出的位置和大小吗

类MyLayout:NSCollectionViewLayout{
var attr:[nsCollectionViewLayoutAttribute]=[]
覆盖变量collectionViewContentSize:NSSize{
得到{
如果self.collectionView?.frame==nil{
返回,零
}
返回NSSize(宽度:CGFloat(self.collectionView?.frame.width±0),高度:CGFloat(self.collectionView?.numberOfSections±0)*75)
}
}
重写func prepare(){
超级准备
打印(“准备()\(字符串(描述:collectionView?.frame)))
self.attr=[]
让高度=CGFloat(75)
对于0..n集合视图布局属性中的s{
打印(“元素在\(indexPath)”的布局属性)
对于attr中的attr{
如果attr.indepath==indepath{
返回属性
}
}
归零
}
覆盖函数应验证布局(对于边界新边界:NSRect)->Bool{
真的
}
}
class MyLayout: NSCollectionViewLayout {

    var attr: [NSCollectionViewLayoutAttributes] = []

    override var collectionViewContentSize: NSSize {
        get {
            if self.collectionView?.frame == nil {
                return .zero
            }
            return NSSize(width: CGFloat(self.collectionView?.frame.width ?? 0), height: CGFloat(self.collectionView?.numberOfSections ?? 0) * 75)
        }
    }

    override func prepare() {
        super.prepare()

        print("prepare() \(String(describing: collectionView?.frame))")
        self.attr = []
        let height = CGFloat(75)

        for s in 0..<(collectionView?.numberOfSections ?? 0) {

            let width = CGFloat((collectionView?.frame.width ?? 0)) / CGFloat((collectionView?.numberOfItems(inSection: s) ?? 1))


            for i in 0..<(collectionView?.numberOfItems(inSection: s) ?? 0) {

                let attr = NSCollectionViewLayoutAttributes(forItemWith: IndexPath(arrayLiteral: s, i))
                var shiftedOrigin = collectionView?.frame.origin ?? .zero
                shiftedOrigin = shiftedOrigin.applying(CGAffineTransform(translationX: width * CGFloat(i), y: CGFloat(s) * height))
                attr.frame = NSRect(origin: shiftedOrigin, size: NSSize(width: width, height: height))
                print(attr.frame)
                self.attr.append(attr)
            }
        }
    }

    override func layoutAttributesForElements(in rect: NSRect) -> [NSCollectionViewLayoutAttributes] {
        print("layout attributes for elements IN \(rect)")

        var returnAttr: [NSCollectionViewLayoutAttributes] = []
        for attr in attr {
            if rect.intersects(attr.frame) {
                returnAttr.append(attr)
            }
        }
        collectionView?.updateConstraints()
        return returnAttr
    }

    override func layoutAttributesForItem(at indexPath: IndexPath) -> NSCollectionViewLayoutAttributes? {
        print("layout attributes for elements AT \(indexPath)")

        for attr in attr {
            if attr.indexPath == indexPath {
                return attr
            }
        }

        return nil
    }

    override func shouldInvalidateLayout(forBoundsChange newBounds: NSRect) -> Bool {
        true
    }
}