Swift: TableViewCell неожиданное поведение тени

Я пытаюсь создать табличное представление с расширяемыми ячейками. Ячейки также имеют смещение с обеих сторон на несколько пикселей, а также набор shadowPath.

Пример GIF, который я имею в виду.

Первая проблема заключается в том, что shadowPath s не анимируются должным образом, пока ячейки перезагружают свою высоту и положение. Это мгновенный переход от тени к полной тени после остановки анимации высоты / положения. (обратите внимание на повернутую камеру)

Вторая проблема возникает, когда вы нажимаете на другую ячейку, когда она уже развернута. 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
}

Я постараюсь ответить как можно скорее на любой ответ / вопрос по теме. Спасибо.

0 ответов

Другие вопросы по тегам