2015-10-01 3 views
4

Я пытаюсь использовать автоматическое определение размера ячейки UITableView в swift с помощью snapKit! соответствующие флаги установлены на UITableView следующим образом:Использование автоматической компоновки в UITableviewCell

self.rowHeight = UITableViewAutomaticDimension 
self.estimatedRowHeight = 70.0 

У меня есть UITextField, определенный в моем классе customUITableviewCell как:

var uidTextField: UITextField = UITextField() 

и первоначальной настройки текстового поля в моем обычае UITableViewCell выглядит следующим образом :

self.contentView.addSubview(uidTextField) 
uidTextField.attributedPlaceholder = NSAttributedString(string: "Woo Hoo", attributes: [NSForegroundColorAttributeName:UIColor.lightGrayColor()]) 
uidTextField.textAlignment = NSTextAlignment.Left 
uidTextField.font = UIFont.systemFontOfSize(19) 
uidTextField.returnKeyType = UIReturnKeyType.Done 
uidTextField.autocorrectionType = UITextAutocorrectionType.No 
uidTextField.delegate = self 
uidTextField.addTarget(self, action: "uidFieldChanged", forControlEvents: UIControlEvents.EditingChanged) 
uidTextField.snp_makeConstraints { make in 
    make.left.equalTo(self.contentView).offset(10) 
    make.right.equalTo(self.contentView) 
    make.top.equalTo(self.contentView).offset(10) 
    make.bottom.equalTo(self.contentView).offset(10) 
} 

при запуске кода он показывает отрезан и дает мне ошибку в консоли, которая гласит:

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.

Есть ли что-то не так с моими ограничениями autoLayout или это проблема с UIControls и автоопределение UITableView ячеек?

ответ

2

В SnapKit (и масонстве) вы должны использовать отрицательные значения, чтобы добавить отступ справа или снизу. Вы используете offset(10) в своем bottom ограничении, которое вызывает эффект, при котором нижние 10pt вашего текстового поля будут обрезаны.

Чтобы исправить это, вы должны дать ваше нижнее ограничение отрицательное смещение:

uidTextField.snp_makeConstraints { make in 
    make.left.equalTo(self.contentView).offset(10) 
    make.right.equalTo(self.contentView) 
    make.top.equalTo(self.contentView).offset(10) 
    make.bottom.equalTo(self.contentView).offset(-10) 
} 

Или вы могли бы получить те же ограничения, делая это:

uidTextField.snp_makeConstraints { make in 
    make.edges.equalTo(contentView).inset(UIEdgeInsetsMake(10, 10, 10, 0)) 
} 

Когда вы используете inset() путь вы должны использовать положительные значения для правой и нижней вставки.

Я не понимаю, почему SnapKit использует отрицательные значения для нижнего и правого. Я думаю, что это противоречиво и немного запутанно.

EDIT: Это небольшой пример, который работает отлично (я зашиты в Tableview с 3 пользовательских ячеек, которые включают в себя UITextField а):

ViewController:

import UIKit 
import SnapKit 

class ViewController: UIViewController { 
    let tableView = UITableView() 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     view.addSubview(tableView) 
     tableView.dataSource = self 
     tableView.rowHeight = UITableViewAutomaticDimension 
     tableView.estimatedRowHeight = 70 
     tableView.registerClass(CustomTableViewCell.self, forCellReuseIdentifier: "CustomCell") 

     tableView.snp_makeConstraints { (make) -> Void in 
      make.edges.equalTo(view) 
     } 
    } 
} 

extension ViewController: UITableViewDataSource { 
    func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
     return 1 
    } 

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

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCellWithIdentifier("CustomCell", forIndexPath: indexPath) 
     return cell 
    } 
} 

CustomTableViewCell :

import UIKit 

class CustomTableViewCell: UITableViewCell { 
    let textField = UITextField() 

    override init(style: UITableViewCellStyle, reuseIdentifier: String?) { 
     super.init(style: style, reuseIdentifier: reuseIdentifier) 

     textField.attributedPlaceholder = NSAttributedString(string: "Woo Hoo", attributes: [NSForegroundColorAttributeName:UIColor.lightGrayColor()]) 
     textField.textAlignment = NSTextAlignment.Left 
     textField.font = UIFont.systemFontOfSize(19) 
     textField.returnKeyType = UIReturnKeyType.Done 
     textField.autocorrectionType = UITextAutocorrectionType.No 
     contentView.addSubview(textField) 

     textField.snp_makeConstraints { (make) -> Void in 
      make.edges.equalTo(contentView).inset(UIEdgeInsetsMake(10, 10, 10, 0)) 
     } 
    } 

    required init?(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 
} 
+0

Здравствуйте, извините, я не вернусь к вам сегодня, однако ячейка по-прежнему не имеет правильного размера при использовании вставки, а не смещения, как вы предполагали. Такая же ошибка: Обнаружен случай, когда ограничения двусмысленно указывают на высоту нуля для представления содержимого ячейки таблицы. Мы рассматриваем крах непреднамеренно и используем стандартную высоту вместо Хотя я считаю, что вы правы с неправильным использованием смещения. Я все еще смотрю на это – CWineland

+0

Имеет ли ваш UITextField постоянную высоту? – joern

+0

Это не так, я предполагал, что он будет иметь внутреннюю или заданную высоту, основанную на высоте текста. Я постараюсь дать ему высоту – CWineland

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