Выровнять узлы в древовидной иерархии - PullRequest
0 голосов
/ 06 января 2020

Примечание:

Я ищу альтернативное решение , поскольку я попытался изменить множество значений свойств набора Sprite и пришел к выводу, что это невозможно с этими изменениями. Так что я не публикую код. Вы можете попробовать упомянутую библиотеку для получения дополнительной информации.

Оригинальный вопрос:

Я использую библиотеку BLBubbleFilters для создания пузырей. Эта библиотека использовала свойство magneti c, чтобы выровнять элементы по центру экрана. И каждый раз, когда открывается экран, расположение каждого узла отличается.

Что я пробовал до сих пор?

  • Я пытался поиграть с библиотекой и ее физическими атрибутами (например, свойство Магнети c), чтобы достичь своей цели.

BLBubbleFilters

Цель:

  • Поместить узел «Семейство» поверх всех узлов, а остальные узлы под ним.

Что Я думал, что каждый узел будет иметь свойство, например, «приоритет (целое число)». То есть узлы с приоритетом 0 будут размещены над всеми узлами, узлы с приоритетом 1 ниже узлов с приоритетом 0 и т. Д.

Поскольку SpriteKit имеет дело со свойствами физики, существует ли какое-либо такое свойство или способ достижения моей цели? ?

Target

Посмотрите, как семейный пузырь находится на вершине.

1 Ответ

1 голос
/ 10 января 2020

Я должен был сделать что-то подобное, и я сделал, создав пользовательский SelectInterestsCollectionViewFlowLayOut, и я добавил пузырьки в UICollectionViewCells.

Результатом было следующее. enter image description here

Каждая ячейка - это белый квадрат, а внутри у меня есть изображение с радиусом угла 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 размера.

Вы можете настроить код для достижения собственного результата. В моем случае у меня было фиксированное количество пузырьков и фиксированный вид для их отображения. Причина, по которой я решил сделать это с представлением коллекции, заключалась в том, что, если число меняется, вы можете просто добавить позиции для изменения позиции x в positionsToIncreaseXPosition, и это будет работать.

...