2016-04-06 2 views
7

Я пытаюсь реализовать ячейку просмотра таблицы, которая отображает серию значков, которые представляют домашние удобства (например, полотенца, wifi, прачечная и т. Д.). Ячейка может потенциально отображать большое количество удобств (в зависимости от того, сколько у вас дома), поэтому я отображу максимум три и укажу, что вы можете просмотреть больше, нажав на ячейку, если их больше трех. Вот то, что она должна выглядеть (из приложения AirBnB в):Программно добавить subviews в UIStackView

enter image description here

Я пытаюсь сделать это динамически добавлять 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++ 
     } 

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

enter image description here

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

Подумайте, что здесь не так?

+2

Использование 'addArrangedSubview' – dan

ответ

22

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

Примечание: однако, если вы удаляете представление из массива arrangedSubviews в UIStackView, оно равно Подраздел. Из документации UIStackView:

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

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

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

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

Это всегда хорошая идея, чтобы начать с документации.

+2

Также стоит отметить из документации:« UIStackView - это неиндексирующий подкласс UIView. Он не предоставляет никакого пользовательского интерфейса. Вместо этого он просто управляет положением и размером своих упорядоченных представлений. В результате некоторые свойства (например, backgroundColor) не влияют на представление стека. «Вот почему kcstricks не видит своего зеленого фона. –

+0

Спасибо @robmayoff! На самом деле, я не дошел до этого в документах. Мне стыдно! –

+0

Приношу свои извинения за задержанный ответ! У меня наконец было время, чтобы вернуться в приложение и попробовать это. Отлично! Спасибо! Спасибо @robmayoff за полезную ноту. – kcstricks

Смежные вопросы