Как отобразить матрицу в Swift 3 - PullRequest
0 голосов
/ 13 мая 2018

У меня есть матрица целых чисел со значениями 1 или 0. Я хочу отобразить элемент в представлении для позиций в матрице, которые имеют значения 1, используя UIImage представление.Я работаю в Xcode 8 и Swift 3. Я сделал это с помощью HTML (с помощью переключателей), но в Swift я действительно понятия не имею.

Я хочу что-то вроде этого:

How I want to display my Matrix

1 Ответ

0 голосов
/ 13 мая 2018

Вы можете хранить данные следующим образом:

let data: [Int: [Int]]

Затем вы можете выполнять итерации по ним, проверяя, равны ли они нулям или единицам, и в зависимости от результата вы можете построить представление примерно так:

  1. Создать 1 представление горизонтального стека
  2. Создать количество представлений вертикального стека, равное столбцам
  3. При перечислении данных для каждого представления вертикального стека добавить пустое представлениеесли данные == 0 или представление изображения, если данные == 1 с фиксированным размером
  4. Когда один «столбец» готов, добавьте его в представление горизонтального стека
  5. Показать представление горизонтального стека вэкран

Если вы немного поиграете со стеками, это будет легкой задачей:)

Пример кода DO REFACTOR !!

class MatrixView: UIView {
    private let data: [[Int]]

    init(frame: CGRect, data: [[Int]]) {
        self.data = data
        super.init(frame: frame)
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    override func draw(_ rect: CGRect) {
        super.draw(rect)
        backgroundColor = .yellow
        layoutMatrix()
    }

    private func layoutMatrix() {
        let dataLenght = data.count
        let dataHeight  = data[0].count
        let horizontalStackView = UIStackView(frame: bounds)
        horizontalStackView.axis = .horizontal

        let imageViewWidth = frame.width / CGFloat(dataHeight)
        let imageViewHeight = frame.height / CGFloat(dataLenght)
        let imageViewRect = CGRect(x: 0, y: 0, width: imageViewWidth, height: imageViewHeight)

        for i in 0..<dataLenght {
            let verticalStackView = UIStackView()
            verticalStackView.axis = .vertical
            verticalStackView.widthAnchor.constraint(equalToConstant: imageViewWidth).isActive = true
            verticalStackView.heightAnchor.constraint(equalToConstant: frame.height).isActive = true
            for j in 0..<dataHeight {
                let viewToInsert: UIView
                if data[i][j] == 1 {
                    let image = UIImageView(image: #imageLiteral(resourceName: "icon.png"))
                    image.widthAnchor.constraint(equalToConstant: imageViewWidth).isActive = true
                    image.heightAnchor.constraint(equalToConstant: imageViewHeight).isActive = true
                    viewToInsert = image
                } else {
                    let empty = UIView(frame: imageViewRect)
                    empty.backgroundColor = .white
                    empty.widthAnchor.constraint(equalToConstant: imageViewWidth).isActive = true
                    empty.heightAnchor.constraint(equalToConstant: imageViewHeight).isActive = true
                    viewToInsert = empty
                }
                verticalStackView.addArrangedSubview(viewToInsert)
            }
            horizontalStackView.addArrangedSubview(verticalStackView)
        }

        addSubview(horizontalStackView)
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...