Използване на автоматично оформление в UITableviewCell

Опитвам се да използвам автоматично оразмеряване на UITableView клетки в swift със snapKit! съответните флагове, зададени на UITableView са както следва:

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)
}

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

Предупреждение само веднъж: Открит е случай, при който ограниченията двусмислено предполагат нулева височина за изгледа на съдържанието на клетка за изглед на таблица. Смятаме, че свиването е непреднамерено и вместо това използваме стандартна височина.

Има ли нещо нередно с моите ограничения на autoLayout или това е проблем с UIControls и автоматичното оразмеряване на UITableView клетки?


person CWineland    schedule 01.10.2015    source източник


Отговори (1)


В SnapKit (и Masonry) трябва да използвате отрицателни стойности, за да добавите подложка отдясно или отдолу на изглед. Използвате offset(10) на вашето ограничение bottom, което причинява ефекта, че долните 10 пункта на вашето текстово поле ще бъдат отрязани.

За да коригирате това, трябва да дадете на долното си ограничение отрицателно отместване:

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 използва отрицателни стойности за долната и дясната страна. Мисля, че това е контраинтуитивно и малко объркващо.

РЕДАКТИРАНЕ: Това е малък пример, който работи добре (твърдо кодирах 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")
    }
}
person joern    schedule 03.10.2015
comment
Здравейте, съжалявам, че не се свързах с вас днес, но клетката все още не е правилно оразмерена, когато използвате вмъкване, а не изместване, както предложихте. Същата грешка: Открит е случай, при който ограниченията двусмислено предполагат нулева височина за изгледа на съдържанието на клетка за изглед на таблица. Смятаме, че свиването е непреднамерено и вместо това използваме стандартна височина, въпреки че вярвам, че сте прав с неправилното използване на отместването. Все още проучвам това - person CWineland; 05.10.2015
comment
Вашият UITextField има ли постоянна височина? - person joern; 05.10.2015
comment
Не е така, предполагах, че ще има присъща или зададена височина въз основа на височината на текста. Ще се опитам да му дам височина - person CWineland; 05.10.2015
comment
Получавам грешка при конфликт в ограниченията след посочване на височина ‹SnapKit.LayoutConstraint:0x7fb9cad1de50@/Users/chris.wineland/Desktop/tableViewCellController.swift#55 UITextField:0x7fb9cad4c5f0.top == UITableCellContent:0x7fb9S› cad4c9ait.top.top. LayoutConstraint:0x7fb9cad20370@/Users/chris.wineland/Desktop/tableViewCellController.swift#55 UITextField:0x7fb9cad4c5f0.bottom == UITableViewCellContentView:0x7fb9cad4c9a0.bottom - 10.0›, ‹NSLayoutConstraint:0x7fb9cad52ae0 'UIView-Encapsulated-Layout-Height' V:[ UITableViewCellContentView:0x7fb9cad4c9a0(44)]› - person CWineland; 05.10.2015
comment
Опитайте да замените ограничението на височината на системата за contentView, като зададете на contentView ограничение на височината: make.height.equalTo(uidTextField) - person joern; 05.10.2015
comment
след като зададох височината на изгледа на съдържанието, получавам много подобна грешка около противоречиви ограничения. едно странно нещо, което забелязвам е, че func sizeThatFits(size: CGSize) -› CGSize се извиква, останах с впечатлението, че не се извиква при използване на autolayout, има функция, подобна на тази за auotlayout - person CWineland; 05.10.2015
comment
Опитах се да възпроизведа грешката, която получавате, но всичко работи според очакванията без никакви грешки. Моля, вижте моя редактиран отговор за кода, който използвах. Може би правите нещо различно? - person joern; 05.10.2015