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