1

展開可能なセルを含むテーブル ビューを作成しようとしています。セルには、両側から数ピクセルのオフセットもあり、shadowPath も設定されています。

私が参照しているgifの例。

最初の問題は、セルがその高さと位置をリロードしている間、shadowPaths が適切にアニメーション化されないことです。高さ/位置のアニメーションが停止した後、影なしから完全な影に瞬時にジャンプします。(タップされたセルに注意)

2 つ目の問題は、セルが既に展開されているときに別のセルをタップすると発生します。最初に展開されたセルの shadowPath は、セルがまだ縮小された高さをアニメートしている間に、セルの通常の高さに即座にジャンプします。(最初の展開されたセルに注意してください)

3 番目のバグは常に発生するわけではなく、影とは関係ありませんが (おそらく?)、GIF の記録中になんとかキャプチャできました。どのセルも展開されていない状態で初めてタップすると、1 つのセルが上のセルの真下に移動しました。(下の 2 つのセルを見てください)

とにかく、カスタム 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