可变高度UITableViewCell在滚动到列表末尾并旋转后展开

时间:2016-09-13 09:11:40

标签: ios xamarin.ios autolayout ios-autolayout

更新

我知道造成这种奇怪的布局错误的原因。它是附件(UITableViewCellAccessory)的设置。如果我停止指定附件,布局不会中断。我没有添加这个作为答案,因为答案需要一个解决方案,给我一个配件而不打破布局

我看到人们使用动态高度自定义单元格的大部分问题是它们在旋转之前没有正确的高度。但是我看到相反的情况:所有单元格的高度都适用于其动态内容。向上和向下滚动不会破坏这一点。但是,如果我滚动到列表的底部,然后旋转设备,然后向后旋转一行将成为屏幕高度的0.5到1.5倍。

进一步旋转或进一步滚动会将行返回到预期高度。我在屏幕截图前后加了几个

Table before scroll

Table after scroll and rotate

UITableView的定义如下

this.rootChildrenTable = new UITableView()
            {
                TranslatesAutoresizingMaskIntoConstraints = false,
                AccessibilityIdentifier = "rootChildrenTable",
                RowHeight = UITableView.AutomaticDimension,
                EstimatedRowHeight = 44.0f,
                BackgroundColor = UIColor.GroupTableViewBackgroundColor,
                TableFooterView = new UIView(),
                TableHeaderView = this.searchBar,
                KeyboardDismissMode = UIScrollViewKeyboardDismissMode.OnDrag
            };

请注意,通常的嫌疑人设置为RowHeightEstimatedRowHeight。只要我从标签中移除Lines = 0,使行的高度相同,问题就会消失。

知道我还应该关注什么?

1 个答案:

答案 0 :(得分:1)

我在项目中面临同样的问题。我通过以下方式克服了这一点,为行设置了高度。

 //calculate the height by this way
    override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return self.heightForBasicCell(at: indexPath)
    }


    func heightForBasicCell(at indexPath: IndexPath) -> CGFloat {
        var sizingCell: YourCell? = nil
        var onceToken: dispatch_once_t
        dispatch_once(onceToken, {() -> Void in
            sizingCell = tableView.dequeueReusableCell(withIdentifier: YourCell.cellIdentifier())!
        })
        self.configureBasicCell(sizingCell, at: indexPath)
        return self.calculateHeight(forConfiguredSizingCell: sizingCell)
    }

    func calculateHeight(forConfiguredSizingCell sizingCell: YourCell) -> CGFloat {
        sizingCell!.bounds = CGRect(x: 0.0, y: 0.0, width: CGRectGetWidth(tableView.frame), height: CGRectGetHeight(sizingCell!.bounds))
        sizingCell!.setNeedsLayout()
        sizingCell!.layoutIfNeeded()
        var size = sizingCell!.contentView.systemLayoutSizeFittingSize(UILayoutFittingCompressedSize)
        return size.height + 1.0
        // Add 1.0f for the cell separator height
    }

    func configureBasicCell(_ cell: YourCell, at indexPath: IndexPath) {
//set your text here
    cell(“text”)
    }

根据您的需要更改代码。我刚刚将客观C代码转换为swift。