Программное добавление подпредставлений в UIStackView

Я пытаюсь реализовать ячейку табличного представления, которая отображает серию значков, представляющих домашние удобства (например, полотенца, Wi-Fi, прачечную и т. Д.). В ячейке потенциально может отображаться большое количество удобств (в зависимости от количества в доме), поэтому я покажу максимум три и укажу, что вы можете просмотреть больше, щелкнув ячейку, если их больше трех. Вот как это должно выглядеть (из приложения Airbnb):

введите описание изображения здесь

Я пытаюсь сделать это, динамически добавляя UIImageViews в UIStackView в ячейке табличного представления. Я использую UIStackView с выравниванием, установленным на «Заливка», и установкой распределения на «Равный интервал», идея заключается в том, что в представлении стека значки будут равномерно размещаться независимо от того, сколько я добавляю к нему.

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

Вот код, который я использую, чтобы попытаться динамически добавить UIImageViews в ячейку. Примечание amenities - это массив строк, равных именам значков в папке моих изображений:

        cell.stackView.backgroundColor = UIColor.greenColor()
        var i = 0
        while (i < amenities.count && i < 4) {
            if (i < 3) {
                let imageView = UIImageView(image: UIImage(named: amenities[i]))
                imageView.contentMode = .ScaleAspectFit
                imageView.translatesAutoresizingMaskIntoConstraints = false
                imageView.backgroundColor = UIColor.blueColor()

                // Add size constraints to the image view
                let widthCst = NSLayoutConstraint(item: imageView, attribute: NSLayoutAttribute.Width, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1.0, constant: 50)
                imageView.addConstraint(widthCst)

                // Add image view to stack view
                cell.stackView.addSubview(imageView)
            } else {
                // Add a label to the stack view if there are more than three amenities
                let label = UILabel()
                label.text = "\(amens.count - i) more"
                label.textAlignment = NSTextAlignment.Left
                cell.stackView.addSubview(label)
            }
            i++
        }

Фон представлений изображений синий, а цвет фона представления стека - зеленый. Вот результат для случая, когда в доме есть три удобства:

введите описание изображения здесь

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

Есть идеи, что здесь не так?


person kcstricks    schedule 06.04.2016    source источник
comment
Используйте 1_   -  person dan    schedule 07.04.2016


Ответы (1)


Как сказал Дэн в комментариях, используйте addArrangedSubview, чтобы добавить подвид, который будет автоматически размещен UIStackView.

Однако обратите внимание: если вы удалите представление из массива arrangedSubviews в UIStackView, оно будет по-прежнему подвидом. Из документации UIStackView:

Представление стека гарантирует, что его свойство visibleSubviews всегда является подмножеством его свойства subviews. В частности, представление стека применяет следующие правила:

• Когда представление стека добавляет представление к своему массиву managedSubviews, оно также добавляет это представление в качестве подпредставления, если это еще не сделано.

• Когда подпредставление удаляется из представления стека, представление стека также удаляет его из массива sizesubviews.

• При удалении представления из массива sizesubviews оно не удаляется как подпредставление. Представление стека больше не управляет размером и положением представления, но оно по-прежнему является частью иерархии представлений и отображается на экране, если оно отображается.

Всегда полезно начинать с документации.

person Alex Popov    schedule 06.04.2016
comment
Также стоит отметить из документации: «UIStackView - это подкласс UIView без отрисовки. Он не имеет собственного пользовательского интерфейса. Вместо этого он просто управляет положением и размером своих упорядоченных представлений. В результате некоторые свойства (например, backgroundColor) не влияют на представление стека. Вот почему kcstricks не видит ее зеленый фон. - person rob mayoff; 07.04.2016
comment
Спасибо, @robmayoff! На самом деле я не продвинулся так далеко в документации. Мне стыдно! - person Alex Popov; 07.04.2016
comment
Приношу свои извинения за задержку с ответом! Наконец-то у меня появилось время вернуться в приложение и опробовать его. Сработало отлично! Спасибо! Также спасибо @robmayoff за полезную заметку. - person kcstricks; 01.05.2016