[英]Align Nodes in tree hierarchy
笔记:
我正在寻找替代解决方案,因为我已经尝试更改大量 Sprite Kit 属性值,并得出结论,这些更改是不可能的。 所以我不发布任何代码。 您可以尝试上述库以获取更多信息。
原问题:
我正在使用BLBubbleFilters库来创建气泡。 该库使用磁性将对齐项目拉到屏幕中心。 而且每次屏幕打开时每个节点的定位都不一样。
到目前为止我尝试了什么?
目标是:
我的想法是,每个节点都有一个属性,例如“priority(Integer)”。 也就是说,优先级为 0 的节点将放置在所有节点之上,优先级为 1 的节点将放置在优先级为 0 的节点之下,依此类推。
由于 SpriteKit 处理物理属性,是否有任何此类属性或方法可以实现我的目标?
看看,家庭泡沫是如何达到顶峰的。
我不得不做类似的事情,我通过创建一个自定义SelectInterestsCollectionViewFlowLayOut
并在UICollectionViewCells
添加了气泡。
每个单元格都是一个白色方块,在里面我有一个角半径为 1/2 * 高度的图像视图。
不同之处在于,在我的情况下,我的所有气泡都具有相同的气泡大小。
我的代码是:
enum InterestBubbleType {
case A
case B
case C
case D
case E
func getYPosition(cellSideSize: CGFloat) -> CGFloat {
let spaceFromTopForTwoCellsOnTop: CGFloat = cellSideSize / 2
switch self {
case .A:
return cellSideSize
case .B:
return cellSideSize * 2
case .C:
return spaceFromTopForTwoCellsOnTop
case .D:
return cellSideSize + spaceFromTopForTwoCellsOnTop
case .E:
return 0
}
}
}
class SelectInterestsCollectionViewFlowLayOut: UICollectionViewFlowLayout {
var cache: [UICollectionViewLayoutAttributes] = []
var layoutAttributes: [UICollectionViewLayoutAttributes] = []
var cellSideSize: CGFloat!
var xPosition: CGFloat = 0
var itemPositions: [InterestBubbleType] = [.A,.C,.D,.E,.A,.B,.C,.D,.E,.A,.B,.C,.D,.A,.B,.C,.D,.E,.A,.B]
var positionsToIncreaseXPosition = [0,2,5,7,10,12,14,16]
override func prepare() {
cache = []
super.prepare()
//Prepare constants
self.xPosition = 0
cellSideSize = self.collectionView!.height() / 3
self.configureCasheForTwentyInterests()
}
private func configureCasheForTwentyInterests() {
for i in 0...(self.itemPositions.count - 1) {
let indexPath = IndexPath(item: i, section: 0)
let xPosition = self.xPosition
let frame = CGRect(x: xPosition, y: self.itemPositions[i].getYPosition(cellSideSize: self.cellSideSize), width: self.cellSideSize, height: self.cellSideSize)
let atribute = UICollectionViewLayoutAttributes(forCellWith: indexPath)
atribute.frame = frame
cache.append(atribute)
if self.positionsToIncreaseXPosition.contains(i) {
self.xPosition += self.cellSideSize
}
}
}
override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
self.layoutAttributes = []
for uiCollectionViewLayoutAttribute in self.cache {
self.layoutAttributes.append(uiCollectionViewLayoutAttribute)
}
return layoutAttributes
}
override func layoutAttributesForItem(at indexPath: IndexPath) -> UICollectionViewLayoutAttributes? {
return layoutAttributes[indexPath.row]
}
override var collectionViewContentSize: CGSize {
let totalWidth = cellSideSize * 9
return CGSize(width: totalWidth, height: self.collectionView!.height())
}
}
现在它是如何工作的,在我的集合视图中有 5 个不同的 y 位置,气泡可以在集合视图内,它们是 A、B、C、D、E,当您需要再移动 1 个时,我也会记住x 位置,即 1 * collectionViewWidth 大小。
您可以配置代码以实现您自己的结果。 就我而言,我有固定数量的气泡和固定视图来显示它们。 我选择使用集合视图进行操作的原因是,如果数字发生变化,您只需添加位置以更改 positionToIncreaseXPosition 中的 x positionsToIncreaseXPosition
,它就会起作用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.