UIStackView будет сжимать представления везде, где это возможно, чтобы противодействовать этому, установите привязку высоты и привязку ширины к UITableView или приоритет для его высоты и ширины. Вот рабочий пример того, как мы можем управлять размерами таблицы в представлении стека.
Расширение для создания экземпляра и централизованного позиционирования UIStackView.
Прежде всего, я написал расширение UIStackView, чтобы мне не нужно было включать весь код внутри контроллера представления. Ваше позиционирование и настройка будут другими, потому что вы помещаете представление стека внутри представления прокрутки, но выделение этого кода означает, что вы можете вносить свои собственные корректировки.
extension UIStackView {
convenience init(axis:UILayoutConstraintAxis, spacing:CGFloat) {
self.init()
self.axis = axis
self.spacing = spacing
self.translatesAutoresizingMaskIntoConstraints = false
}
func anchorStackView(toView view:UIView, anchorX:NSLayoutXAxisAnchor, equalAnchorX:NSLayoutXAxisAnchor, anchorY:NSLayoutYAxisAnchor, equalAnchorY:NSLayoutYAxisAnchor) {
view.addSubview(self)
anchorX.constraintEqualToAnchor(equalAnchorX).active = true
anchorY.constraintEqualToAnchor(equalAnchorY).active = true
}
}
Мы не устанавливаем размер для UIStackView только для позиции, это вещи, содержащиеся в нем, которые определяют его размер. Также обратите внимание на установку translatesAutoresizingMaskIntoConstraints
в false в расширении UIStackView. (Требуется только, чтобы мы установили это свойство для представления стека, его подпредставления просто наследуют поведение.)
Класс UITableView с исходным кодом данных
Затем я создал базовый класс таблицы для демонстрационных целей.
class MyTable: UITableView, UITableViewDataSource {
let data = ["January","February","March","April","May","June","July","August","September","October","November","December"]
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return data.count
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("SauceCell", forIndexPath: indexPath)
cell.textLabel?.text = data[indexPath.row]
return cell
}
}
Настройка представления стека и таблицы в контроллере представления
Наконец, важные вещи. Как только мы добавляем нашу таблицу в представление стека, вся информация о фрейме игнорируется. Поэтому нам нужны последние две строки кода, чтобы установить ширину и высоту таблицы в терминах, понятных Auto Layout.
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
let table = MyTable(frame: CGRect(x: 0, y: 0, width: view.frame.width, height: view.frame.height))
table.registerClass(UITableViewCell.self, forCellReuseIdentifier: "SauceCell")
table.dataSource = table
let stack = UIStackView(axis: .Vertical, spacing: 10)
stack.anchorStackView(toView: view, anchorX: stack.centerXAnchor, equalAnchorX: view.centerXAnchor, anchorY: stack.centerYAnchor, equalAnchorY: view.centerYAnchor)
stack.addArrangedSubview(table)
table.widthAnchor.constraintEqualToAnchor(view.widthAnchor, multiplier: 1).active = true
table.heightAnchor.constraintEqualToAnchor(view.heightAnchor, multiplier: 0.5).active = true
}
}
Обратите внимание, что мы используем addArrangedSubview:
а не addSubview:
при добавлении представлений в представление стека.
(Я написал сообщения в блоге об UIStackView, а также другие сведения об автоматическом макете в вообще это тоже может помочь.)
person
sketchyTech
schedule
08.03.2016