2017-02-10 15 views
2

Есть похожие вопросы, но ответы не работали для меня. В динамической таблице я хочу отображать изображения с разным уровнем. Каждая ячейка имеет UIImageView с contentMode = .scaleAspectFit, поэтому изображение красиво берет ширину стола и принимает высоту столько, сколько необходимо.Динамический UITableView с изображениями

Cell имеет 4 ограничения: enter image description here

Таблица контроллер представления:

class TableTableViewController: UITableViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     tableView.estimatedRowHeight = 100 
     tableView.rowHeight = UITableViewAutomaticDimension 
    } 

    override func numberOfSections(in tableView: UITableView) -> Int { 

     return 1 
    } 

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 

     return 2 
    } 

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCell(withIdentifier: String(describing: ImageTableViewCell.self), for: indexPath) as! ImageTableViewCell 

     let image = indexPath.row == 0 ? UIImage(named: "1.jpg")! : UIImage(named: "2.jpg")! 
     cell.customImageView.image = image 

     return cell 
    } 
} 

Результат:

enter image description here

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

cell.heightConstraint.constant = cell.frame.width * image.size.height/image.size.width 

, но она нарушает его содержимые ограничения ячейки.

Проект можно скачать here>>

+0

Так в основном вы хотите TableView, которые имеют динамическую ячейку высоты? –

+0

Правильно установить ограничения – Harish

+0

@Dharmesh Kheni да, поэтому высота ячейки равна высоте изображения. – sash

ответ

3

В вашем ImageTableViewCell.swift

import UIKit 

class ImageTableViewCell: UITableViewCell { 

    @IBOutlet weak var customImageView: UIImageView! 

    internal var aspectConstraint : NSLayoutConstraint? { 
     didSet { 
      if oldValue != nil { 
       customImageView.removeConstraint(oldValue!) 
      } 
      if aspectConstraint != nil { 
       customImageView.addConstraint(aspectConstraint!) 
      } 
     } 
    } 

    override func prepareForReuse() { 
     super.prepareForReuse() 
     aspectConstraint = nil 
    } 

    func setPostedImage(image : UIImage) { 

     let aspect = image.size.width/image.size.height 

     aspectConstraint = NSLayoutConstraint(item: customImageView, attribute: NSLayoutAttribute.width, relatedBy: NSLayoutRelation.equal, toItem: customImageView, attribute: NSLayoutAttribute.height, multiplier: aspect, constant: 0.0) 

     customImageView.image = image 
    } 
} 

И в ваш TableTableViewController.swift ваш метод cellForRowAt будет:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "ImageTableViewCell", for: indexPath) as! ImageTableViewCell 

    let image = imageArr[indexPath.row] 
    cell.setPostedImage(image: image!) 
    return cell 
} 

И объявите ваш imageArr этот путь:

let imageArr = [UIImage(named: "1.jpg"), UIImage(named: "2.jpg")] 

И ваш код соперничают будет:

import UIKit 

class TableTableViewController: UITableViewController { 

    let imageArr = [UIImage(named: "1.jpg"), UIImage(named: "2.jpg")] 
    override func viewDidLoad() { 
     super.viewDidLoad() 

     tableView.estimatedRowHeight = 100 
     tableView.rowHeight = UITableViewAutomaticDimension 
    } 

    override func numberOfSections(in tableView: UITableView) -> Int { 

     return 1 
    } 

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 

     return 2 
    } 

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCell(withIdentifier: "ImageTableViewCell", for: indexPath) as! ImageTableViewCell 

     let image = imageArr[indexPath.row] 
     cell.setPostedImage(image: image!) 
     return cell 
    } 
} 

И THIS будет ваш результат.

EDIT:

Чтобы устранить ограничение вопрос задать aspectConstraint999 приоритет и aspectConstraint будет:

internal var aspectConstraint : NSLayoutConstraint? { 
    didSet { 
     if oldValue != nil { 
      customImageView.removeConstraint(oldValue!) 
     } 
     if aspectConstraint != nil { 
      aspectConstraint?.priority = 999 //add this 
      customImageView.addConstraint(aspectConstraint!) 
     } 
    } 
} 
+0

Спасибо за помощь. К сожалению, ваш код нарушает ограничения. Проверьте консоль при ее запуске - Невозможно одновременно удовлетворить ограничения. – sash

+0

Чтобы исправить ограничения на разрыв, вам необходимо установить приоритет ограничения на 999. Я приму ответ, когда вы его обновите. Спасибо – sash

+0

@sash проверить обновленный код. –