Как добавить массив UIButtons на UIStackview? - PullRequest
1 голос
/ 03 мая 2019

Я использую 26 букв алфавита и создаю UIButton с соответствующей буквой, после создания массива UIButtons я отправляю массив, в котором я храню эти кнопки, и добавляю его в представление стека ,

Вид стека также находится внутри UIView, который называется abcBtnView.

Это работает, если я передаю ему весь массив UIButton, но 26 кнопок по вертикали или по горизонтали выглядят не очень хорошо. Поэтому я решил вместо отправки массива из 26 кнопок отправить 6 массивов, 5 с 5 UIbuttons и один массив с 1 кнопкой.

Ошибка, которую я получаю, заключается в том, что я не могу преобразовать UIButton в тип UIView.

Параметр UIStackview(arrangedSubviews: [UIView]) имеет тип [UIView], однако он все равно занял мой массив [UIButton] в первый раз, но он не будет принят, если я добавлю более одного массива UIbuttons.

Мне интересно, как я могу добавить несколько массивов UIButton в UIStackview, чтобы у меня было 6 столбцов и 5 строк UIButton?

ДУМАЕТ, ЧТО Я ПОПРОБОВАЛ:

  1. Попробуйте ввести [UIButton] в [UIView]
  2. Создает массив, который содержит массив UIButtons, а затем ИСПОЛЬЗУЕТСЯ цикл for для добавления каждого UIstackview в наше представление (abcBtnView).

КОД НИЖЕ РАБОТАЕТ, НО Я МОГУ ТОЛЬКО ПРОЙТИ В ОДНОМ UIBUTTON.

private func makeABCbtns(){

    let abcde = createButtons(named: "A", "B", "C", "D", "E")
    let fghij = createButtons(named: "F", "G", "H", "I", "J")
    let klmno = createButtons(named: "K","L", "M", "N", "O")
    let pqrst = createButtons(named: "P", "Q","R", "S", "T")
    let uvwxy = createButtons(named: "U", "V", "W","X", "Y")
    let z     = createButtons(named: "Z")

    let stackView = UIStackView(arrangedSubviews: abcde)
    stackView.translatesAutoresizingMaskIntoConstraints = false
    stackView.axis = .horizontal
    stackView.spacing = 1
    stackView.distribution = .fillEqually

    // UIView where all the buttons will be in.
    abcBtnView.addSubview(stackView)


    //I am giving the stackview the size of the abcBtnView.
    stackView.anchor(top: abcBtnView.topAnchor,
                     leading: abcBtnView.leadingAnchor,
                     bottom: abcBtnView.bottomAnchor,
                     trailing: abcBtnView.trailingAnchor,
                     centerXaxis: nil,
                     centerYaxis: nil)
}

func createButtons(named: String...) -> [UIButton]{
    return named.map { letter in
        let button = UIButton()
        button.translatesAutoresizingMaskIntoConstraints = false
        button.setTitle(letter, for: .normal)
        button.backgroundColor = .green
        button.setTitleColor( .blue , for: .normal)
        return button
    }

}

Ответы [ 2 ]

0 голосов
/ 03 мая 2019

Ваш код работал с использованием скелетной раскадровки, поэтому проблема может быть в другом месте вашего кода.Вот код, переработанный на основе предложения Теджи.

  private func makeABCbtns(){

    let list = [["A", "B", "C", "D", "E"], ["F", "G", "H", "I", "J"], ["K","L", "M", "N", "O"], ["P", "Q","R", "S", "T"], ["U", "V", "W","X", "Y"], ["Z"]]
    var groups = [UIStackView]()

    for i in list {
      let group = createButtons(named: i)
      let subStackView = UIStackView(arrangedSubviews: group)
      subStackView.axis = .horizontal
      subStackView.distribution = .fillEqually
      subStackView.spacing = 1
      groups.append(subStackView)
    }

    let stackView = UIStackView(arrangedSubviews: groups)
    stackView.axis = .vertical
    stackView.distribution = .fillEqually
    stackView.spacing = 1
    stackView.translatesAutoresizingMaskIntoConstraints = false

    abcBtnView.addSubview(stackView)

    stackView.leadingAnchor.constraint (equalTo: abcBtnView.leadingAnchor,  constant: 0).isActive = true
    stackView.topAnchor.constraint     (equalTo: abcBtnView.topAnchor,      constant: 0).isActive = true
    stackView.trailingAnchor.constraint(equalTo: abcBtnView.trailingAnchor, constant: 0).isActive = true
    stackView.bottomAnchor.constraint  (equalTo: abcBtnView.bottomAnchor,   constant: 0).isActive = true
  }

  func createButtons(named: [String]) -> [UIButton]{
    return named.map { letter in
      let button = UIButton()
      button.translatesAutoresizingMaskIntoConstraints = false
      button.setTitle(letter, for: .normal)
      button.backgroundColor = .green
      button.setTitleColor( .blue , for: .normal)
      return button
    }
  }
}

Result

0 голосов
/ 03 мая 2019

Похоже, вы пытаетесь создать сетку из UIButton с. Это не может быть сделано с одним UIStackView. Вместо этого вам либо нужно иметь кучу UIStackView внутри другого UIStackView, что просто сказать, что это довольно плохая идея.

Или вместо того, чтобы заново изобретать колесо, вы можете использовать UICollectionView и выложить свои кнопки в виде сетки. Каждая кнопка будет внутри UICollectionViewCell.

...