繁体   English   中英

在树层次结构中对齐节点

[英]Align Nodes in tree hierarchy

笔记:

我正在寻找替代解决方案,因为我已经尝试更改大量 Sprite Kit 属性值,并得出结论,这些更改是不可能的。 所以我不发布任何代码。 您可以尝试上述库以获取更多信息。

原问题:

我正在使用BLBubbleFilters库来创建气泡。 该库使用磁性将对齐项目拉到屏幕中心。 而且每次屏幕打开时每个节点的定位都不一样。

到目前为止我尝试了什么?

  • 我曾尝试使用库及其物理属性(例如磁性属性)来实现我的目标。

BLBubbleFilters

目标是:

  • 将 'Family' 节点放在所有节点上方和上方,其余节点位于其下方。

我的想法是,每个节点都有一个属性,例如“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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM