滚动到tableview中的行然后闪烁行

时间:2017-06-13 01:53:34

标签: ios swift uitableview

我想滚动到该行并通过更改背景颜色来闪烁行。 我可以滚动到该行。我使用方法cellForRow(at:)来获取单元格以供以后修改和动画。但是cell是零。我不明白为什么它是零,因为我可以滚动到具有相同indexPath的行。

let indexPath = IndexPath(row: rowIndex, section: 0)
self.tableView.scrollToRow(at: indexPath, at: .top, animated: true)
let cell = self.tableView.cellForRow(at: indexPath) // return nil.
if let cell = cell { // nil
// animation here.
}

2 个答案:

答案 0 :(得分:2)

根据文档,cellForRow(at: indexPath)返回:

  

表示表格单元格的对象,如果单元格不可见或indexPath超出范围,则为nil。

当您致电cellForRow(at: indexPath)时,您的手机尚未显示,因为动画滚动尚未完成。

要跟踪滚动动画完成,您必须实施UITableViewDelegate协议:

class YourVC : UIViewController, UITableViewDelegate {

    override func viewDidLoad() {
        // ... your code
        self.tableView.delegate = self
    }

    func scrollViewDidEndScrollingAnimation(_ scrollView: UIScrollView) {
        let cell = self.tableView.cellForRow(at: indexPathToAnimate) // returns your cell object
        if let cell = cell {
            // animation here.
        }
    }
}

答案 1 :(得分:0)

如果单元格不可见,您将获得零值。通常,单元格动画在tableview委托willDisplay cell中执行。

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath)

这是在细胞出现时从左侧为细胞设置动画的代码。您可以通过检查执行动画所需的索引路径来修改和执行所需的动画。

<强>目标C

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath{
    //1. Setup the CATransform3D structure
    CATransform3D rotation;
    rotation = CATransform3DMakeScale(0, 0, 0);


    //2. Define the initial state (Before the animation)
    cell.layer.shadowColor = [[UIColor blackColor]CGColor];

    cell.layer.transform = rotation;
    cell.layer.anchorPoint = CGPointMake(1, 0);


    //3. Define the final state (After the animation) and commit the animation
    [UIView beginAnimations:@"rotation" context:NULL];
    [UIView setAnimationDuration:0.7];
    cell.layer.transform = CATransform3DIdentity;
    [UIView commitAnimations];
}

Swift 3

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {

    //1. Setup the CATransform3D structure
    let rotation = CATransform3DMakeScale(0, 0, 0)

    //2. Define the initial state (Before the animation)
    cell.layer.shadowColor = UIColor.black.cgColor
    cell.layer.transform = rotation
    cell.layer.anchorPoint = CGPoint(x: 1, y: 0)

    //3. Define the final state (After the animation) and commit the animation
    UIView.beginAnimations("rotation", context: nil)
    UIView.setAnimationDuration(0.7)
    cell.layer.transform = CATransform3DIdentity
    UIView.commitAnimations()
}