如何为UICollectionView单元格选择设置动画

时间:2018-03-13 17:20:25

标签: ios swift animation uicollectionview uicollectionviewcell

animated的这些方法的UICollectionView参数是什么:

  • selectItem(at indexPath: IndexPath?, animated: Bool, scrollPosition: UICollectionViewScrollPosition)
  • deselectItem(at indexPath: IndexPath, animated: Bool)

我知道我可以使用UICollectionViewLayout对象来动画更改。我也知道我可以使用didSelect的{​​{1}}和didDeselect方法获取所选单元格并应用动画。但我找不到任何有关上述UICollectionViewDelegate参数如何影响动画的信息。它会以任何方式影响布局动画吗?我的目标是创建一个animated子类,并允许使用者在内部调用上述两种方法时自定义是否应用动画。但我不知道这些方法控制的动画是什么。

2 个答案:

答案 0 :(得分:3)

我建议用动画覆盖 Widget _buildItemsForListView(BuildContext context, int index) { return Card( child: Column( children: <Widget>[ Image.asset(Constants.FOOD_PLACEHOLDER_IMAGE_ASSET_URL, height: 50,width: 100), Text("Spinach soup", style: TextStyle(color: Colors.deepPurple, fontSize: 16), textAlign: TextAlign.left,), Text("SAR", style: TextStyle(color: Colors.black, fontSize: 14), textAlign: TextAlign.left), Text("26", style: TextStyle(color: Colors.black, fontSize: 14), textAlign: TextAlign.left,), Text( "Fresh spinach, mushrooms, and hard-boiled egg served with warm bacon vinaigrette", style: TextStyle(color: Colors.black, fontSize: 14), textAlign: TextAlign.left,), Text("15.4" + " Calories", style: TextStyle(color: Colors.black, fontSize: 14), textAlign: TextAlign.left,) ], ), ); } 的{​​{1}}属性。这样,如果用户点击一个单元格并停止思考下一步该怎么做,动画状态将被保留。

isHighlighted

答案 1 :(得分:1)

animated UICollectionView中的selectItem(at:animated:scrollPosition:)确定是否应将所选项目(如果不在视野中或已在所需位置)滚动到一个动画时尚与否。
如果它在视野中,那么这个animated属性并没有真正做任何事情,afaik。
animated中的deselectItem(at:animated:)也是如此。它没有做任何事情,只是在那里。

我唯一看到影响布局引擎的是collectionView滚动并且你在didSelectItemAt中有动画然后它会使这些动画无效。您必须延迟单元格中出现的动画(请参阅本答复中的最后一个示例)

如您所知,但对于其他人而言,如果您想要为单元格选择事件设置动画,则必须在collectionView(_:didSelectItemAt:)委托中自行完成。

示例:

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    let cell = collectionView.cellForItem(at: indexPath)

    //Briefly fade the cell on selection
    UIView.animate(withDuration: 0.5,
                   animations: {
                    //Fade-out
                    cell?.alpha = 0.5
    }) { (completed) in
        UIView.animate(withDuration: 0.5,
                       animations: {
                        //Fade-out
                        cell?.alpha = 1
        })
    }

}

如果用户点按某个单元格,但如果您以编程方式调用selectItem(at:animated:scrollPosition:),则上述情况很好,但它不会触发上述collectionView(_:didSelectItemAt:)委托,您需要明确调用它才能运行你的选择动画。

示例(上一个附加组件):

func doSelect(for aCollectionView: UICollectionView,
              at indexPath: IndexPath) {
    aCollectionView.selectItem(at: indexPath,
                               animated: true,
                               scrollPosition: .centeredVertically)

    //DispatchQueue after sometime because scroll animation renders
    //the animation block in `collectionView(_:didSelectItemAt:)` ineffective
    DispatchQueue.main.asyncAfter(deadline: .now() + 0.27) { [weak self] in
        self?.collectionView(aCollectionView,
                             didSelectItemAt: indexPath)
    }
}