2016-12-10 5 views
1

Я пытаюсь создать представление стека с пользовательскими представлениями внутри. Каждое пользовательское представление в этом примере имеет одинаковую информацию. По какой-то причине вместо того, чтобы идти каждый после каждого subviews перекрываются, и я не могу понять, почему. У меня нет ограничений (в макете). Представление стека находится внутри прокрутки, потому что может быть много подпунктов.Почему пользовательские представления в представлении стека перекрываются?

Код пользовательского вида:

import UIKit 

class AddressComponentView: UIView { 

    @IBOutlet weak var labelStreet: UILabel! 
@IBOutlet weak var labelCity: UILabel! 
@IBOutlet weak var labelOfficialRegionType: UILabel! 
@IBOutlet weak var labelOfficialRegionTitle: UILabel! 
@IBOutlet weak var labelCountry: UILabel! 
@IBOutlet weak var labelZip: UILabel! 

var view: UIView! 

func loadData(address: AddressData){ 
    self.labelStreet.text = address.street 
    self.labelCity.text = address.city 
    self.labelOfficialRegionType.text = address.region?.officialRegionType 
    self.labelOfficialRegionTitle.text = address.region?.officialRegionTitle 
    self.labelZip.text = address.zip 
    self.labelStreet.sizeToFit() 
} 

override init(frame: CGRect) { 
    super.init(frame: frame) 
} 

required init?(coder aDecoder: NSCoder) { 
    super.init(coder: aDecoder) 
} 

}

Вот как я динамически добавлять подвидов (viewContent стековой вид):

viewScroll.contentSize = CGSize(width: 320, height: 1000) 

      let viewsDictionary = ["stackView":viewContent] 
      let stackView_H = NSLayoutConstraint.constraints(
       withVisualFormat: "H:|-20-[stackView]-20-|", //horizontal constraint 20 points from left and right side 
       options: NSLayoutFormatOptions(rawValue: 0), 
       metrics: nil, 
       views: viewsDictionary) 
      let stackView_V = NSLayoutConstraint.constraints(
       withVisualFormat: "V:|-30-[stackView]-30-|", //vertical constraint 30 points from top and bottom 
       options: NSLayoutFormatOptions(rawValue:0), 
       metrics: nil, 
       views: viewsDictionary) 
      view.addConstraints(stackView_H) 
      view.addConstraints(stackView_V) 


let addressView = UINib(nibName: "AddressComponent", bundle: nil).instantiate(withOwner: nil, options: nil)[0] as! AddressComponentView 

addressView.loadData(address: (item?.addressData)!) 
viewContent.addArrangedSubview(addressView) 

let addressView1 = UINib(nibName: "AddressComponent", bundle: nil).instantiate(withOwner: nil, options: nil)[0] as! AddressComponentView 

addressView1.loadData (адрес: (item? .addressData)!) viewContent.addArrangedSubview (addressView1)

А вот ужасный результат:

crap

That's what happened if I add 30 subviews:

enter image description here

Вот что случилось, если добавить 30 подвидов:

Другое дело, что очень странно, является тот факт, что я сделайте фоновое пользовательское представление синим и установите его непрозрачным, и по каким-либо причинам эти свойства игнорируются. То есть, как компонент выглядит во время разработки: Теперь я пытаюсь добавить эти подвидов в прототип ячейки UITableView:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 

    if indexPath.row == 3 || indexPath.row == 7 { 
     var text = "Run the app again, and it will look nothing has really changed. You are now using your bioLabel, but it’s just showing one line of text in each cell. Even though the number of lines is set to 0 and your constraints are properly configured so your bioLabel takes up" 

     let customView1 = UINib(nibName: "CustomView1", bundle: nil).instantiate(withOwner: nil, options: nil)[0] as! CustomView1 
     customView1.frame = CGRect(x:0, y:0, width: 200, height: 60) 
     customView1.loadData(text: text) 
     cell.container.addSubview(customView1) 
    } else { 
     let customView2 = UINib(nibName: "CustomView2", bundle: nil).instantiate(withOwner: nil, options: nil)[0] as! CustomView2 

     customView2.loadData(text: "aaaaa adfsd") 
     cell.container.addSubview(customView2) 

    } 

    // Configure the cell... 

    return cell 
} 

Этот код очень глупо, я просто экспериментировал с различными видами (я создал 2 пользовательские представления). Оба они имеют примерно одинаковый код:

class CustomView1: UIView { 

@IBOutlet weak var label1: UILabel! 

func loadData(text: String){ 
    label1.text = text 
} 
override init(frame: CGRect) { 
    super.init(frame: frame) 
} 

required init?(coder aDecoder: NSCoder) { 
    super.init(coder: aDecoder) 
} 

}

NB cell.container является мнение, что я вкладываю в прототип клетки.

+0

Можете ли вы опубликовать, как результат будет, если вы поместите 3-4 AddressComponent, возможно, он перебирает границы просмотра стека, возможно, у вас должно быть ограничение на высоту AddressComponent, чтобы теперь представление в стеке могло быть большим, чем должно быть. – Markicevic

+0

@ Маркевич, спасибо за ваш ответ. Я добавил больше фотографий в свой пост. Извините за беспорядок с комментариями там, я не мог понять, как правильно их поместить, но теперь вы должны получить эту идею. Я добавил 30 просмотров. – mimic

ответ

1

Проблема в том, что строка UIStackView не знает высоту UIStackView, пытается установить высоту этого представления или, возможно, изменить свойство распределения UIStackView. Почему вы сейчас используете UITableView для пользователя, это выглядит как прекрасный пример использования UITableView, чем вам не нужно UIScrollView?

+0

Если я настрою высоту стека, то ничего не отображается. Я не знаю, может быть, мой выбор этого контейнера был неправильным. По моему мнению, мне нужен был контейнер, который позволяет добавлять элементы один за другим, но я не принимал во внимание, что stackview * возможно * всегда пытается равномерно распределить контент. Подразделы, которые я собираюсь добавить, не равны по высоте вообще, и я заранее не знаю, какие представления будут добавлены (они основаны на свойствах объекта). Позволяет ли UITableView добавлять неравные элементы? – mimic

+0

Сделайте некоторые подсказки о uitableview и uicollectionview, я думаю, вы найдете то, что вам нужно в этом учебнике. – Markicevic

+1

https://www.raywenderlich.com/129059/self-sizing-table-view-cells – Markicevic

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

  • Нет связанных вопросов^_^