2015-07-13 1 views
1

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

var viewBindingsDict: NSMutableDictionary = NSMutableDictionary() 
viewBindingsDict.setValue(myTitleLabel, forKey: "label") 
viewBindingsDict.setValue(myDescriptionLabel, forKey: "description") 
let horizontalConstraints = NSLayoutConstraint.constraintsWithVisualFormat("H:|-10-[label]-10-|", options: nil, metrics: nil, views: viewBindingsDict as [NSObject : AnyObject]) as [AnyObject] 
let horizontalConstraints2 = NSLayoutConstraint.constraintsWithVisualFormat("H:|-10-[description]-10-|", options: nil, metrics: nil, views: viewBindingsDict as [NSObject : AnyObject]) as [AnyObject] 
let verticalConstraints = NSLayoutConstraint.constraintsWithVisualFormat("V:|-10-[label]-5-[description]-10-|", options: nil, metrics: nil, views: viewBindingsDict as [NSObject : AnyObject]) as [AnyObject] 
self.contentView.addConstraints(horizontalConstraints + horizontalConstraints2 + verticalConstraints) 

И в контроллере табличного,

self.tableView.estimatedRowHeight = 60 
self.tableView.rowHeight = UITableViewAutomaticDimension 

В источнике данных табличного представления,

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier) as! MyCell 

    // setup cell 

    cell.setNeedsUpdateConstraints() 
    cell.updateConstraintsIfNeeded() 
    return cell 
} 

Это работает для большинства клеток, но всегда есть одна или две клетки не должным образом установленные вне. Например, в этом test project первая строка неправильно организована, но когда я прокручиваю нижнюю часть (первая строка выходит из представления), затем прокручивается назад, она фиксируется сама. Я попытался использовать XIB и программно создать ячейку. Но не повезло.

Любая идея? Пожалуйста, см. test project, чтобы увидеть это странное поведение.

+0

попробуйте не использовать 'self.tableView.estimatedRowHeight' – nathanwhy

+0

Я пробовал свой код в github, и он работал, как ожидалось. Что такое версия Swift и версия iOS, на которой работает ваш симулятор? – ozgur

+0

запустите приложение в симуляторе, а затем попробуйте опцию «Debug View Hierarchy», расположенную в нижней части Xcode. – Krishna

ответ

0

Видимо реальный источник проблемы является ширина кадра клетки не установлена ​​правильно, пока он не отображается на экране, то есть, MyCell всегда инициируется с шириной 320 очков кадра. Поскольку представление таблицы вычисляет высоту строк перед отображением ячеек, это вызывает проблемы, когда приложение запускается в iPhone 6 или 6, плюс ширина не 320 точек. Поэтому я добавил следующий код в начале setupSubviews функции в классе MyCell.

self.frame.size.width = UIScreen.mainScreen().applicationFrame.size.width 

И теперь ячейки отображаются на правильной высоте, как только отображается представление таблицы.

И для того, чтобы решить эту проблему при использовании XIB, я переопределить awakeFromNib

override func awakeFromNib() { 
    super.awakeFromNib() 
    // we need to set the cell's width so that content view's width will be set correctly 
    self.frame.size.width = UIScreen.mainScreen().applicationFrame.size.width 
} 

Я обновил test project, если кто заинтересован.