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
}
Я постараюсь ответить как можно скорее на любой ответ / вопрос по теме. Спасибо.