Ios UITableView单元格在编辑模式下被切断

Ios UITableView单元格在编辑模式下被切断,ios,uitableview,Ios,Uitableview,基本上,我有一个表视图,其中包含来自documents文件夹的文件数组。到目前为止,我已经根据文本标签的大小调整了单元格的高度,如下所示: - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { float height = 30;// y value of dataLabel CGRect labelRect = [[directoryCon

基本上,我有一个表视图,其中包含来自documents文件夹的文件数组。到目前为止,我已经根据文本标签的大小调整了单元格的高度,如下所示:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    float height = 30;// y value of dataLabel
    CGRect labelRect = [[directoryContents objectAtIndex:indexPath.row]
                        boundingRectWithSize:CGSizeMake(tableView.frame.size.width-15, 0)
                        options:NSStringDrawingUsesLineFragmentOrigin
                        attributes:@{NSFontAttributeName : [UIFont systemFontOfSize:15]}
                        context:nil];

    height=height+labelRect.size.height+30;
    return height;
}
如果cell.textLabel以1行或2行开头,则可以相应地显示。但是,当我点击导航栏中的编辑按钮以打开编辑模式时,如果cell.textLabel一度为1行,但由于空间缩小而下降到2行,则单元格将不会调整,并被单元格边框剪裁

我如何防止这种情况发生

更新图像:

被称为:

- (void)setEditing:(BOOL)editing animated:(BOOL)animated {
    [super setEditing:editing animated:animated];

    [self.tableView beginUpdates];
    [self.tableView endUpdates];
}

任何帮助都将不胜感激。谢谢。

boundingRectWithSize:值意味着标签可能具有的最大大小。目前,您正在将其设置为所需的宽度ok,但高度为零!这可能就是问题所在

请将此
0
替换为
CGFLOAT\u MAX
,如下所示

CGRect labelRect = [[directoryContents objectAtIndex:indexPath.row]
                    boundingRectWithSize:CGSizeMake(self.view.frame.size.width-15, CGFLOAT_MAX)
                    options:NSStringDrawingUsesLineFragmentOrigin
                    attributes:@{NSFontAttributeName : [UIFont systemFontOfSize:15]}
                    context:nil];
除此之外,请确保已正确配置约束,即固定到顶部、左侧、右侧和底部对应对象的每一侧距离常量。(以及单元格中的任何其他对象受到适当约束),这样当单元格高度调整得更大时,保存文本的
UILabel
会根据这些值拉伸,以便查看所有文本


我希望这有助于标签的
boundingRectWithSize:
值应该是最大大小。目前,您正在将其设置为所需的宽度ok,但高度为零!这可能就是问题所在

请将此
0
替换为
CGFLOAT\u MAX
,如下所示

CGRect labelRect = [[directoryContents objectAtIndex:indexPath.row]
                    boundingRectWithSize:CGSizeMake(self.view.frame.size.width-15, CGFLOAT_MAX)
                    options:NSStringDrawingUsesLineFragmentOrigin
                    attributes:@{NSFontAttributeName : [UIFont systemFontOfSize:15]}
                    context:nil];
除此之外,请确保已正确配置约束,即固定到顶部、左侧、右侧和底部对应对象的每一侧距离常量。(以及单元格中的任何其他对象受到适当约束),这样当单元格高度调整得更大时,保存文本的
UILabel
会根据这些值拉伸,以便查看所有文本


我希望这有助于

如果我们希望在选择模式下编辑时单元格内容向右移动,那么UITableViewCell子类中的代码对我来说很好,前提是我们使用的单元格具有动态高度:

 class UITableViewCellSubclass {
        var contentViewSubviewTrailingConstraint: NSLayoutContraint?

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

        private func initializeViews() {
            contentViewSubview.translatesAutoresizingMaskIntoConstraints = false
            contentView.addSubview(contentViewSubview)
            contentViewSubviewTrailingConstraint = contentViewSubview.trailingAnchor.constraint(equalTo: contentView.trailingAnchor)
            NSLayoutConstraint.activate([
                contentViewSubview.topAnchor.constraint(equalTo: contentView.topAnchor),
                contentViewSubview.leadingAnchor.constraint(equalTo: contentView.leadingAnchor),
                contentViewSubviewTrailingConstraint ?? stackView.trailingAnchor.constraint(equalTo: contentView.trailingAnchor),
                contentViewSubview.bottomAnchor.constraint(equalTo: contentView.bottomAnchor),
            ])
        }

        override func setEditing(_ editing: Bool, animated: Bool) {
            super.setEditing(editing, animated: animated)
            if editing {
                contentViewSubviewTrailingConstraint?.constant = contentView.frame.origin.x
            } else {
                contentViewSubviewTrailingConstraint?.constant = 0
            }
        }
    }
如果我们希望整个内容在编辑模式下可见,并且表格视图单元可以调整高度,则viewController中的以下代码可以正常工作(使用动态高度单元和所有约束(顶部、底部、左侧、右侧)都正确应用)


如果在选择模式下编辑时希望单元格内容向右移动,则UITableViewCell子类中的此代码适用于我,前提是我们使用具有动态高度的单元格:

 class UITableViewCellSubclass {
        var contentViewSubviewTrailingConstraint: NSLayoutContraint?

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

        private func initializeViews() {
            contentViewSubview.translatesAutoresizingMaskIntoConstraints = false
            contentView.addSubview(contentViewSubview)
            contentViewSubviewTrailingConstraint = contentViewSubview.trailingAnchor.constraint(equalTo: contentView.trailingAnchor)
            NSLayoutConstraint.activate([
                contentViewSubview.topAnchor.constraint(equalTo: contentView.topAnchor),
                contentViewSubview.leadingAnchor.constraint(equalTo: contentView.leadingAnchor),
                contentViewSubviewTrailingConstraint ?? stackView.trailingAnchor.constraint(equalTo: contentView.trailingAnchor),
                contentViewSubview.bottomAnchor.constraint(equalTo: contentView.bottomAnchor),
            ])
        }

        override func setEditing(_ editing: Bool, animated: Bool) {
            super.setEditing(editing, animated: animated)
            if editing {
                contentViewSubviewTrailingConstraint?.constant = contentView.frame.origin.x
            } else {
                contentViewSubviewTrailingConstraint?.constant = 0
            }
        }
    }
如果我们希望整个内容在编辑模式下可见,并且表格视图单元可以调整高度,则viewController中的以下代码可以正常工作(使用动态高度单元和所有约束(顶部、底部、左侧、右侧)都正确应用)


OP更新了相应的图像。我是以编程的方式完成这一切的,所以我不确定是否设置了约束。您的建议没有效果。@ChrisOSX我想知道是否将单元格的宽度设置为tableview的框架可能是原因,因为它可能会更改以允许显示编辑UI。如果你调整宽度以匹配屏幕宽度,比如说,那么将整个单元格向右推的编辑UI会是一个更好的选择吗?虽然这在很大程度上对我来说是可行的,主要是如果它预测该行可以变成两行,它会自动调整它的间距,而不是大小调整动画。所以我决定继续这个路径,将标题设置为一行,然后使用NSLineBreakByTruncatingMiddle。对我来说足够好:)OP更新了相应的图像。我是以编程的方式完成这一切的,所以我不确定是否设置了约束。您的建议没有效果。@ChrisOSX我想知道是否将单元格的宽度设置为tableview的框架可能是原因,因为它可能会更改以允许显示编辑UI。如果你调整宽度以匹配屏幕宽度,比如说,那么将整个单元格向右推的编辑UI会是一个更好的选择吗?虽然这在很大程度上对我来说是可行的,主要是如果它预测该行可以变成两行,它会自动调整它的间距,而不是大小调整动画。所以我决定继续这个路径,将标题设置为一行,然后使用NSLineBreakByTruncatingMiddle。对我来说已经够好了:)尤其是最后一段很有帮助。谢谢,特别是最后一段很有帮助。谢谢