Хобрук: Ваш путь к мастерству в программировании

Динамическая ячейка tableview, предотвращение создания автоматического ограничения высоты

Я столкнулся с этой проблемой уже несколько дней и до сих пор не нашел решения. В основном я пытаюсь создать UITableView с ячейками с самодиагностикой. Я установил автоматическую высоту ячеек с помощью UITableViewAutomaticDimension. Высота ячейки ограничена для проверки моего кода, поскольку это ограничение должно определять высоту ячейки. Вот мои ограничения для ячейки:

let views = ["view": view]
self.addConstraints(NSLayoutConstraint.constraints(
    withVisualFormat: "H:|[view]|",
    options: [],
    metrics: nil,
    views: views
))

self.addConstraints(NSLayoutConstraint.constraints(
    withVisualFormat: "V:|[view]|",
    options: [],
    metrics: nil,
    views: views
))

NSLayoutConstraint(item: contentView, attribute: .width, relatedBy: .equal, toItem: self.superview!, attribute: .width, multiplier: 1, constant: 0).isActive = true

И вот сообщение об ошибке, которое я получаю:

2017-04-17 22:40:01.596805-0300 ViraVira-Info[52208:1001696] [LayoutConstraints] Unable to simultaneously satisfy constraints.
    Probably at least one of the constraints in the following list is one you don't want. 
    Try this: 
        (1) look at each constraint and try to figure out which you don't expect; 
        (2) find the code that added the unwanted constraint or constraints and fix it. 
    (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) 
(
    "<NSAutoresizingMaskLayoutConstraint:0x600000099190 h=--& v=--& UITableViewCellContentView:0x7f987070f5f0.height == 44.5   (active)>",
    "<NSLayoutConstraint:0x6000000966c0 UIView:0x7f9870709be0.height == 100   (active)>",
    "<NSLayoutConstraint:0x600000098dd0 V:|-(0)-[UIView:0x7f9870709be0]   (active, names: '|':UITableViewCellContentView:0x7f987070f5f0 )>",
    "<NSLayoutConstraint:0x600000098e70 V:[UIView:0x7f9870709be0]-(0)-|   (active, names: '|':UITableViewCellContentView:0x7f987070f5f0 )>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x6000000966c0 UIView:0x7f9870709be0.height == 100   (active)>

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful.

Как видите, tableview автоматически создает height constraint, что конфликтует с другим моим ограничением по высоте.

"<NSAutoresizingMaskLayoutConstraint:0x600000099190 h=--& v=--& UITableViewCellContentView:0x7f987070f5f0.height == 44.5   (active)>"

Но я не могу найти способ удалить или предотвратить это ограничение. Я уже пытался установить translatesAutoresizingMask равным false для представления содержимого, представления ячейки собственно и UIView, добавляемого в представление содержимого, но безуспешно. Это привело к следующей ошибке:

Warning once only: Detected a case where constraints ambiguously suggest a height of zero for a `tableview cell's` content view. We're considering the collapse unintentional and using standard height instead.

Пожалуйста, запрашивайте дополнительную информацию, и я с радостью добавлю ее к этому вопросу.


  • view.translatesAutoresizingMaskIntoConstraints = false должно помочь @ J.Paravicini 18.04.2017
  • Вы задали вопрос? Я заявил, что уже пробовал, но безуспешно: / 18.04.2017
  • попробуйте на cell.contentView.translatesAutoresizingMaskIntoConstraints 18.04.2017
  • @ J.Paravicini есть любое другое представление, если это так, установите все view.translatesAutoresizingMaskIntoConstraints = false 18.04.2017
  • @NazmulHasan Я попытался отключить translatesAutoresizingMaskIntoConstraints во всех представлениях и подпредставлениях, и у меня появилась следующая ошибка в консоли: Предупреждение только один раз: обнаружен случай, когда ограничения неоднозначно предполагают нулевую высоту для представления содержимого ячейки табличного представления. Мы считаем обрушение непреднамеренным и вместо этого используем стандартную высоту. 18.04.2017
  • @ J.Paravicini Форсирование высоты возврата и расчетной высоты сделало строку tableview 18.04.2017
  • @ J.Paravicini вы установили, например, self.tableView.estimatedRowHeight = 80 self.tableView.rowHeight = UITableViewAutomaticDimension в viewdidLoad ()? 18.04.2017
  • @ J.Paravicini обновите мой ответ, не могли бы вы проверить это, пожалуйста 18.04.2017

Ответы:


1

ЭТО ВСЕ, ЧТО ВАМ НУЖНО СДЕЛАТЬ-:

МАРК-: Но я сделал это программно. Работает отлично.

import UIKit

class ViewController: UIViewController,UITableViewDelegate,UITableViewDataSource {

   lazy var tableView : UITableView = {
        var tableView  =  UITableView()
        tableView.delegate = self // Table view delegate
        tableView.dataSource = self // table view datasource
        tableView.translatesAutoresizingMaskIntoConstraints = false // set  translatesAutoresizingMaskIntoConstraints to false
        return tableView 
    }()

    override func viewDidLoad() {
        super.viewDidLoad()
        view.addSubview(tableView) // Add table on view
        tableView.estimatedRowHeight = 50 // table row estimated row height
        tableView.rowHeight = UITableViewAutomaticDimension //Automatic dimensions

        tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell") // register cell
        view.addConstraintsWithFormat(format: "H:|[v0]|", views: tableView) // give table view constraints horizontal
        view.addConstraintsWithFormat(format: "V:|[v0]|", views: tableView) // vertical

    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


    // MARK-: Table view DELEGATE METHODS

      func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
      {
        return 5
    }


    // Row display. Implementers should *always* try to reuse cells by setting each cell's reuseIdentifier and querying for available reusable cells with dequeueReusableCellWithIdentifier:
    // Cell gets various attributes set automatically based on table (separators) and data source (accessory views, editing controls)


    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
    {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
        cell.textLabel?.text = "abcd"
        cell.textLabel?.numberOfLines = 0 // SET YOUR LABEL numberOfLines to 0
        cell.textLabel?.sizeToFit()
        if indexPath.row == 1
        {
            cell.textLabel?.text = "asdvhvcjkhsvcjhsvcjhsvchjvcjhsvcjhsvchdveiuvcjsdvccjgdcgygdchjsvcjsvcjvclsvccvsjvhjsvchsvcvhdchvsjvhcjjhhyuioplkjhxxzasdfghtyuiklopl"
        }
        return cell
    }


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


}
extension UIView
{

    func addConstraintsWithFormat(format:String,views:UIView...)
    {
        var allViews = [String:UIView]()
        for data in 0...views.count-1
        {
            let key = "v\(data)"
            allViews[key] = views[data]
        }
        addConstraints(NSLayoutConstraint.constraints(withVisualFormat: format, options: NSLayoutFormatOptions(), metrics: nil, views: allViews))

    }



}

Для работы с раскадровкой сделайте следующее:

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

Кодовая часть:

ViewController-:

class ViewController: UIViewController,UITableViewDelegate,UITableViewDataSource {

    @IBOutlet weak var dynamicTable: UITableView!

    override func viewDidLoad() {
        super.viewDidLoad()

        dynamicTable.estimatedRowHeight = 70 // table row estimated row height
       dynamicTable.rowHeight = UITableViewAutomaticDimension //Automatic dimensions

    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


    // MARK-: Table view DELEGATE METHODS

      func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
      {
        return 5
    }


    // Row display. Implementers should *always* try to reuse cells by setting each cell's reuseIdentifier and querying for available reusable cells with dequeueReusableCellWithIdentifier:
    // Cell gets various attributes set automatically based on table (separators) and data source (accessory views, editing controls)


    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
    {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! testing
        cell.automaticLabel?.text = "abcd"
        cell.automaticLabel?.numberOfLines = 0 // SET YOUR LABEL numberOfLines to 0
        cell.automaticLabel?.sizeToFit()
        if indexPath.row == 1
        {
            cell.automaticLabel?.text = "asdvhvcjkhsvcjhsvcjhsvchjvcjhsvcjhsvchdveiuvcjsdvccjgdcgygdchjsvcjsvcjvclsvccvsjvhjsvchsvcvhdchvsjvhcjjhhyuioplkjhxxzasdfghtyuiklopl"
        }
        return cell
    }


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

Пользовательский класс ячейки:

import UIKit

class testing: UITableViewCell {

    @IBOutlet weak var automaticLabel: UILabel!
    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
    }

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
    }

}
18.04.2017
  • Ответ, в котором есть только код, не очень полезен. Пожалуйста, объясните почему именно это и нужно делать. Как этот код решил проблему в вопросе? 06.09.2020
  • Новые материалы

    Математика и интуиция - Часть 1
    У каждой математической формулы есть доказательство. Часто эти доказательства слишком сложно понять, поскольку многие из них основаны на индукции, некоторые - на очень сложных наблюдениях, а..

    Раскрытие возможностей НЛП: часть речевой маркировки и ее проблемы
    В сфере обработки естественного языка (NLP) маркировка частей речи (POS) выступает в качестве фундаментального метода, позволяющего компьютерам понимать и анализировать человеческий язык на..

    Под поверхностью: раскрытие деталей системы с помощью инструментов Linux CLI
    Чем больше вы изучаете Linux и продвигаетесь вперед, тем больше вам нужно проверять информацию о вашей системе. Эта информация может касаться аппаратного обеспечения, такого как процессор,..

    Как реализовать линейную регрессию в JavaScript
    Узнайте, как реализовать линейную регрессию в JavaScript с помощью ML.js Линейная регрессия — это метод машинного обучения, используемый для моделирования связи между зависимой переменной и..

    Рассвет или закат ?: как контекст будет направлять разработку ИИ для компьютерного зрения в медицинской визуализации
    Рассвет или закат ?: как контекст будет направлять разработку ИИ для компьютерного зрения в медицинской визуализации Посмотрите на картинку выше. Знаете ли вы, является ли это изображением..

    Запуск LF Internship v2 (1 апреля - 1 октября 2019 г.)
    Вот и открылись двери к великолепию 😃. Как и было обещано, заявки на стажировку принимаются с 7 января по 28 февраля 2019 г. . Нажмите ссылку, чтобы подать заявку:..

    BCACTF 4.0 Writeup — Freebee (Интернет)
    Описание вызова: Я хочу прочитать эту действительно классную статью, но у них есть платный доступ. Вы можете мне помочь? Веб-адрес вызова: http://challs.bcactf.com:30771/ . Если вы..