2017-01-18 3 views
0

Я создаю прокручиваемый вид, который является частью оформления корзины покупок.Создайте динамический размер scrollView с 3 динамическими размерами tableViews внутри?

Это Layout View

enter image description here

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

Я проверил этот ответ Change UITableViewHeight Dynamically и предлагает несколько советов о том, как сделать мой UITableViews автоматическим значительным, но мне нужно как UIView и TableViews внутри быть динамически ощутимыми.

Любая помощь очень ценится.

+3

Что вы не можете объединить все данные в трех табличных представлениях в виде одного стола? –

+0

Поскольку каждый из них содержит разные данные, они имеют разные состояния. Если массив, содержащий Canastas, пуст, он должен отправить aa nib с пустой иконкой корзины и меткой «Нет продуктов» , если Canastas не пуст, он должен послать наконечник с ячейкой canastas, а Productos - то же самое , последняя таблица представляет собой сжатое резюме продуктов, содержащихся в предыдущих таблицах. Каждый вид имеет свою собственную функциональность, и размер каждого из них должен быть размером всего количества элементов, содержащихся в массивах, размер scrollView должен соответствующим образом корректироваться. вот почему. –

+0

@OctavioRojas; Является ли каждый прокручиваемый элемент ORI или отображаемым FULL размером в супер scrollView? – Brandon

ответ

1

Я не понимаю, почему вы не хотите, чтобы объединить их в одну таблицу ..

В любом случае .. UIScrollView не работает с Auto-Layout. Вы должны добавить contentView с теми же размерами, что и родительский OR элемента scrollView с фиксированным размером.

Теперь, когда вы находитесь в стороне, вы ограничиваете представление tableViews содержимым содержимого scrollView, а затем переопределяете viewDidLayoutSubviews контроллера. В этой функции вам необходимо получить contentSize каждого tableView и ограничить высоту каждого из них до его размера содержимого. Это сделает таблицу полной и не прокручиваемой.

Поскольку размеры scrollView автоматически зависят от его содержимого, вам не нужно ничего делать.

В качестве альтернативы, если вы не хотите использовать AutoLayoutScrollView, вы можете установить UIScrollView contentSize на сумму contentSize из 3 таблиц в viewDidLayoutSubviews контроллера.

Примечание: У меня нет какой-либо пример динамического контента для tableViews, но если вы хотите их использовать динамические размеры строк, что вам нужно сделать:

table.estimatedRowHeight = 300 //Estimation of the average size of the rows. 

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat 
    return UITableViewAutomaticDimension 
} 

Теперь для фактического кода с высоты жёстко строк (потому что у меня нет динамических данных теста):

// 
// ViewController.swift 
// SO 
// 
// Created by Brandon T on 2017-01-17. 
// Copyright © 2017 XIO. All rights reserved. 
// 

import UIKit 


class AutoLayoutScrollView : UIScrollView { 
    private(set) weak var contentView: UIView! 
    private var hConstraint: NSLayoutConstraint! 
    private var vConstraint: NSLayoutConstraint! 

    init() { 
     super.init(frame: .zero) 
     self.layout() 
    } 

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

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

    private func layout() { 
     let view = UIView() 
     self.contentView = view 
     self.addSubview(self.contentView) 

     self.contentView.leftAnchor.constraint(equalTo: self.leftAnchor).isActive = true 
     self.contentView.rightAnchor.constraint(equalTo: self.rightAnchor).isActive = true 
     self.contentView.topAnchor.constraint(equalTo: self.topAnchor).isActive = true 
     self.contentView.bottomAnchor.constraint(equalTo: self.bottomAnchor).isActive = true 
     self.contentView.translatesAutoresizingMaskIntoConstraints = false 
    } 

    override func didMoveToSuperview() { 
     super.didMoveToSuperview() 

     if let parent = self.superview { 
      self.leftAnchor.constraint(equalTo: parent.leftAnchor).isActive = true 
      self.rightAnchor.constraint(equalTo: parent.rightAnchor).isActive = true 
      self.topAnchor.constraint(equalTo: parent.topAnchor).isActive = true 
      self.bottomAnchor.constraint(equalTo: parent.bottomAnchor).isActive = true 
      self.translatesAutoresizingMaskIntoConstraints = false 

      self.hConstraint = self.contentView.widthAnchor.constraint(equalTo: parent.widthAnchor) 
      self.vConstraint = self.contentView.heightAnchor.constraint(equalTo: parent.heightAnchor) 
      self.hConstraint.isActive = true 
      self.vConstraint.isActive = true 
     } 
    } 

    func setHorizontalScrollEnabled(enabled: Bool) { 
     self.hConstraint.isActive = !enabled 
    } 

    func setVerticalScrollEnabled(enabled: Bool) { 
     self.vConstraint.isActive = !enabled 
    } 
} 

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { 

    private var scrollView: AutoLayoutScrollView! 
    private var topTableView: UITableView! 
    private var middleTableView: UITableView! 
    private var bottomTableView: UITableView! 

    private var topTableHeight: NSLayoutConstraint! 
    private var middleTableHeight: NSLayoutConstraint! 
    private var bottomTableHeight: NSLayoutConstraint! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     self.layout() 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
    } 

    func layout() { 
     //Init Views 
     self.scrollView = AutoLayoutScrollView() 
     self.topTableView = UITableView(frame: .zero, style: .plain) 
     self.middleTableView = UITableView(frame: .zero, style: .plain) 
     self.bottomTableView = UITableView(frame: .zero, style: .plain) 

     self.registerClasses() 

     //Add Views 
     self.view.addSubview(self.scrollView) 
     self.scrollView.contentView.addSubview(self.topTableView) 
     self.scrollView.contentView.addSubview(self.middleTableView) 
     self.scrollView.contentView.addSubview(self.bottomTableView) 

     //Layout Views 
     self.topTableView.leftAnchor.constraint(equalTo: self.scrollView.contentView.leftAnchor).isActive = true 
     self.topTableView.rightAnchor.constraint(equalTo: self.scrollView.contentView.rightAnchor).isActive = true 
     self.topTableView.topAnchor.constraint(equalTo: self.scrollView.contentView.topAnchor).isActive = true 
     self.topTableView.translatesAutoresizingMaskIntoConstraints = false 

     self.middleTableView.leftAnchor.constraint(equalTo: self.scrollView.contentView.leftAnchor).isActive = true 
     self.middleTableView.rightAnchor.constraint(equalTo: self.scrollView.contentView.rightAnchor).isActive = true 
     self.middleTableView.topAnchor.constraint(equalTo: self.topTableView.bottomAnchor).isActive = true 
     self.middleTableView.translatesAutoresizingMaskIntoConstraints = false 

     self.bottomTableView.leftAnchor.constraint(equalTo: self.scrollView.contentView.leftAnchor).isActive = true 
     self.bottomTableView.rightAnchor.constraint(equalTo: self.scrollView.contentView.rightAnchor).isActive = true 
     self.bottomTableView.topAnchor.constraint(equalTo: self.middleTableView.bottomAnchor).isActive = true 
     self.bottomTableView.bottomAnchor.constraint(equalTo: self.scrollView.contentView.bottomAnchor).isActive = true 
     self.bottomTableView.translatesAutoresizingMaskIntoConstraints = false 

     self.topTableHeight = self.topTableView.heightAnchor.constraint(equalToConstant: 0) 
     self.middleTableHeight = self.middleTableView.heightAnchor.constraint(equalToConstant: 0) 
     self.bottomTableHeight = self.bottomTableView.heightAnchor.constraint(equalToConstant: 0) 


     //Set Views Properties 
     self.scrollView.setVerticalScrollEnabled(enabled: true) 

     self.topTableView.delegate = self 
     self.topTableView.dataSource = self 
     self.middleTableView.delegate = self 
     self.middleTableView.dataSource = self 
     self.bottomTableView.delegate = self 
     self.bottomTableView.dataSource = self 


     //Display Views 
     self.topTableView.reloadData() 
     self.middleTableView.reloadData() 
     self.bottomTableView.reloadData() 
    } 

    func registerClasses() { 
     self.topTableView.register(UITableViewCell.self, forCellReuseIdentifier: "cellID") 
     self.middleTableView.register(UITableViewCell.self, forCellReuseIdentifier: "cellID") 
     self.bottomTableView.register(UITableViewCell.self, forCellReuseIdentifier: "cellID") 
    } 

    override func viewDidLayoutSubviews() { 
     super.viewDidLayoutSubviews() 

     //Update tables constraints to full size. 
     self.topTableHeight.constant = self.topTableView.contentSize.height 
     self.middleTableHeight.constant = self.middleTableView.contentSize.height 
     self.bottomTableHeight.constant = self.bottomTableView.contentSize.height 

     self.topTableHeight.isActive = true 
     self.middleTableHeight.isActive = true 
     self.bottomTableHeight.isActive = true 
    } 

    func numberOfSections(in tableView: UITableView) -> Int { 
     return 1 
    } 

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     if (tableView == self.topTableView) { 
      return 10 
     } 

     if (tableView == self.middleTableView) { 
      return 15 
     } 

     if (tableView == self.bottomTableView) { 
      return 3 
     } 

     return 0 
    } 

    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 
     if (tableView == self.topTableView) { 
      return 100 
     } 

     if (tableView == self.middleTableView) { 
      return 250 
     } 

     if (tableView == self.bottomTableView) { 
      return 500 
     } 

     return 0.0 
    } 

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

     let cell = tableView.dequeueReusableCell(withIdentifier: "cellID", for: indexPath) 

     if (tableView == self.topTableView) { 
      cell.contentView.backgroundColor = UIColor.red 
     } 

     if (tableView == self.middleTableView) { 
      cell.contentView.backgroundColor = UIColor.green 
     } 

     if (tableView == self.bottomTableView) { 
      cell.contentView.backgroundColor = UIColor.blue 
     } 

     return cell 
    } 
} 
+0

Удивительный, это был ответ, который я искал, большое спасибо! Я не совмещаю их все в одном столе, потому что у меня есть виды в разных местах (они не смежны), если вы знаете способ иметь разные части одного и того же вида таблицы, разбросанные вокруг в разных частях посмотрите, пожалуйста, дайте мне знать, как и я сделаю это с помощью одного scrollView. –

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

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