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

时间:2016-03-25 22:25:36

标签: ios uitableview

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

- (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行,则单元格不会调整并且会被剪切靠细胞边界。

我如何阻止这种情况发生?

更新图片:

Before After edit mode

被召唤:

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

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

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

2 个答案:

答案 0 :(得分:1)

boundingRectWithSize:值是标签可能存在的最大尺寸。目前您将此设置为所需的宽度确定,但高度!这可能是个问题。

请将此0替换为CGFLOAT_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];

除此之外,请确保正确配置约束 配置,因为每个边距离都是 top ,l < em> eft,right 和 bottom 相应的对象被固定。 (和单元格中的任何其他对象正确约束),这样当单元格高度调整得更大时,保持文本的UILabel会根据这些值进行拉伸,因此您可以看到所有文本< / p>

我希望这会有所帮助

答案 1 :(得分:0)

如果我们希望在选择模式下进行编辑时,单元格内容向右移动,那么只要我们使用具有动态高度的单元格,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中的以下代码可以正常工作(使用动态高度单元格和所有约束(上,下,左,右)正确)

 override func setEditing(_ editing: Bool, animated: Bool) {
        super.setEditing(editing, animated: animated)
        tableView.setEditing(editing, animated: true)
        tableView.beginUpdates()
        tableView.endUpdates()
    }
相关问题