【发布时间】:2016-06-24 14:50:49
【问题描述】:
我无法同时垂直和水平滚动以使用 NSCollectionView 的自定义布局。
根据文档,在我的子类中,我返回collectionViewContentSize,如果它太大,则在集合视图的封闭滚动视图中自动启用滚动。但是,即使我将所有元素排列在水平行中,也只会启用垂直滚动。
这是我的布局代码:
class Layout: NSCollectionViewLayout
{
var cellSize = CGSize(width: 100, height: 30)
var cellSpacing: CGFloat = 10
var sectionSpacing: CGFloat = 20
private var contentSize = CGSize.zero
private var layoutAttributes = [NSIndexPath: NSCollectionViewLayoutAttributes]()
override func prepareLayout() {
guard let collectionView = collectionView else { return }
let sections = collectionView.numberOfSections
guard sections > 0 else { return }
contentSize.height = cellSize.height
for section in 0..<sections {
let items = collectionView.numberOfItemsInSection(section)
guard items > 0 else { break }
for item in 0..<items {
let origin = CGPoint(x: contentSize.width, y: 0)
let indexPath = NSIndexPath(forItem: item, inSection: section)
let attributes = NSCollectionViewLayoutAttributes(forItemWithIndexPath: indexPath)
attributes.frame = CGRect(origin: origin, size: cellSize)
layoutAttributes[indexPath] = attributes
contentSize.width += cellSize.width + cellSpacing
}
contentSize.width += sectionSpacing
}
}
override var collectionViewContentSize: NSSize {
return contentSize
}
override func layoutAttributesForElementsInRect(rect: NSRect) -> [NSCollectionViewLayoutAttributes] {
return layoutAttributes.values.filter { $0.frame.intersects(rect) }
}
override func layoutAttributesForItemAtIndexPath(indexPath: NSIndexPath) -> NSCollectionViewLayoutAttributes? {
return layoutAttributes[indexPath]
}
override func shouldInvalidateLayoutForBoundsChange(newBounds: NSRect) -> Bool {
return false
}
}
【问题讨论】:
-
在
override var collectionViewContentSize,你能打印contentSize和self.collectionView.frame(或同化)吗? -
contentSize: (22200.0, 30.0) frame: (0.0, 0.0, 438.0, 228.0)
-
它垂直工作,当我将布局更改为垂直列时,我可以滚动到最后一项。始终禁用水平滚动。
-
@DasNilpferd 你有没有想过这个问题?
标签: swift macos cocoa nsscrollview nscollectionview