1

我正在尝试创建一个带有可扩展单元格的表格视图。单元格的两侧也有几个像素的偏移量,并且还设置了 shadowPath。

我指的是示例 gif。

一个问题是在单元格重新加载其高度和位置时,shadowPaths 没有正确设置动画。这是高度/位置动画停止后从无阴影到全阴影的瞬间跳跃。(注意被抽头的单元格)

第二个问题是当您在另一个单元格已经展开时点击另一个单元格。第一个展开的单元格的 shadowPath 会立即跳到单元格的正常高度,而单元格仍在为减小的高度设置动画。(注意第一个展开的单元格)

第三错误并非一直发生,也与阴影无关(我想?)但我在录制 gif 时设法捕捉到了它。当我第一次点击时,没有一个单元格被扩展,一个单元格就在上面的单元格下方。(看底部的两个单元格)

无论如何,这是自定义 tableViewCell 的代码:

override func awakeFromNib() {
    super.awakeFromNib()
    self.clipsToBounds = false
    self.layer.shadowOffset = CGSizeMake(1, 1)
    self.layer.shadowOpacity = 0.9
    self.layer.shadowColor = UIColor.blackColor().CGColor
    self.layer.shadowRadius = 2
    self.selectionStyle = .None
}

override var frame: CGRect {
    get {
        return super.frame
    }
    set {
        var tempFrame = newValue
        let inset: CGFloat = cellOffset
        tempFrame.origin.x += inset
        if previousFrame != tempFrame.size.width {
            tempFrame.size.width -= 2 * inset
            previousFrame = tempFrame.size.width
        }
        super.frame = tempFrame
    }
}

override func layoutSubviews() {
    super.layoutSubviews()
    let shPath: CGPathRef = UIBezierPath(rect: self.bounds).CGPath
    self.layer.shadowPath = shPath
}

TableView相关代码:

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    if let tempIndexPath = selectedCellIndexPath where tempIndexPath == indexPath {
        selectedCellIndexPath = nil
    } else {
        selectedCellIndexPath = indexPath
    }
    tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: .Automatic)

    tableView.scrollToRowAtIndexPath(indexPath, atScrollPosition: .Top, animated: true)
}


func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
    if selectedCellIndexPath == indexPath {
        return 200
    }
    return 80
}

我将尝试尽快回复有关该主题的任何答案/问题。谢谢你。

4

0 回答 0