Вложенные UIStackViews не работают в программном интерфейсе пользователя

Я работаю в mainStackView (UIStackView), который имеет 4 горизонтальных подпредставления (строки), и он отлично работает следующим образом (mainStackView управляется с ограничениями AutoLayout):

    rowsArray = Array<UIView>()
    for _ in 0...3 {
        let row = UIView()
        row.backgroundColor = UIColor.randomColor() //color for debugging
        rowsArray.append(row)
    }

    mainStackView = UIStackView(arrangedSubviews: rowsArray)
    mainStackView.axis = .vertical
    mainStackView.alignment = .fill
    mainStackView.distribution = .fillEqually
    mainStackView.translatesAutoresizingMaskIntoConstraints = false
    self.addSubview(mainStackView)

Теперь, учитывая, что каждое подпредставление (в данном случае строка) будет иметь несколько горизонтальных подпредставлений в нем, мне нужно, чтобы в качестве расположения подвидов был массив, но он не может отображать ни одно из подпредставлений.

    rowsArray = Array<UIStackView>()
    for _ in 0...3 {
        let row = UIStackView()
        row.backgroundColor = UIColor.randomColor() //color for debugging
        rowsArray.append(row)
    }

Любая идея, почему UIStackView не ведет себя как суперкласс (UIView), или есть ли какие-либо другие соображения для программного вложения UIStackViews

Rgds ... e


person eharo2    schedule 06.02.2018    source источник


Ответы (1)


Это не ошибка, это сделано так, прочтите следующий отрывок из документации, раздел Управление внешним видом представления стека:

UIStackView - это подкласс UIView без отрисовки; то есть он не имеет собственного пользовательского интерфейса. Вместо этого он просто управляет положением и размером своих упорядоченных представлений. В результате некоторые свойства (например, backgroundColor) не влияют на представление стека.

Это означает, что UIStackView не является классическим UIView, а скорее приятным интерфейсом для размещения его подвидов. Нет смысла создавать UIStackView без упорядоченных подвидов (как в вашем случае).

Добавьте подвиды к тем строкам, которые вы создаете, установите для них красный цвет фона, и вы увидите:

rowsArray = Array<UIStackView>()
for _ in 0...3 {
    let row = UIStackView()
    let view = UIView()
    view.backgroundColor = UIColor.randomColor() //color for debugging
    row.addArrangedSubview(view)
    rowsArray.append(row)
}

Что касается вложенных stackViews, я без проблем пользуюсь им довольно долго, поэтому считаю, что это правильный вариант.

person Milan Nosáľ    schedule 06.02.2018
comment
Спасибо @Milan Nosál '. Немного отдохнув, я обнаружил, что фреймы правильно расположены в отладчике и что свойство backgroundColor UIStackView равно нулю .... когда я увидел ваш ответ. Это имеет смысл ... Добавление представления контейнера должно исправить это. Спасибо.... - person eharo2; 07.02.2018