UITableViewCell шире, чем его UITableView - расширяется вправо? - PullRequest
0 голосов
/ 29 января 2019

Фон

У меня есть UITableView с одной ячейкой.Внутри клетки находится UILabel.Ячейка с именем PickerTableViewCell получает свой пользовательский интерфейс из xib и добавляет его в свое подпредставление.Это сделано потому, что этот xib используется многими различными пользовательскими ячейками.

Проблема

Похоже, что когда эта ячейка освобождается от просмотра представлением таблицы, ее ширина выходит за пределыТаблица показывает ширину с правой стороны.

Вот xib с UILabel, центрированным внутри ячейки, с последующим отображением на устройстве.Обратите внимание, что метка смещена относительно центра на устройстве:

centred xib centred device

Когда я перемещаю метку к самомусправа от клетки (label.trailing = pickerCell.trailing + 0) он исчезает с правой стороны.Ниже показано, как это выглядит в xib, а затем на устройстве:

right xib right device

Когда я выровняюUILabel слева от ячейки (label.leading = pickerCell.leading + 0), он правильно выравнивается по левому краю устройства.

Вот как PickerTableViewCell загружает xib:

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


        // load the xib to associate with
        let nib = Bundle.main.loadNibNamed("PickerTableViewCell", owner: nil, options: nil)
        if let view = nib?.first as? UIView{
            self.addSubview(view)
        }
    // ...
}

Вот как табличное представление регистрирует ячейку:

self.tableView.register(PickerTableViewCell.self, forCellReuseIdentifier: "pickerCell")

И, наконец, вот как она удаляется:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "pickerCell") as! PickerTableViewCell
        return cell
}

Может ли кто-нибудь помочь понять, что происходит ??Почему моя ячейка выходит за пределы ширины представления таблицы?

Ответы [ 2 ]

0 голосов
/ 29 января 2019

В случае использования Nib для дизайна ячеек, не регистрируйте сам класс ячеек, вместо этого зарегистрируйте nib.

Удалите код

init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) 

И процесс регистрации будеткак

let cellNib = UINib.init(nibName: "YourNibName", bundle: nil)
tableView.register(cellNib, forCellReuseIdentifier: "Identifier")

Процесс удаления в порядке.

0 голосов
/ 29 января 2019

При назначении любого xib необходимо указать frame.Вот модифицированный код:

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

    // load the xib to associate with
    let nib = Bundle.main.loadNibNamed("PickerTableViewCell", owner: nil, options: nil)
    if let view = nib?.first as? UIView{
        self.addSubview(view)
        view.frame = bounds //Provide the frame
    }
    // ...
}
...