animated
的这些方法的UICollectionView
参数是什么:
selectItem(at indexPath: IndexPath?, animated: Bool, scrollPosition: UICollectionViewScrollPosition)
deselectItem(at indexPath: IndexPath, animated: Bool)
我知道我可以使用UICollectionViewLayout
对象来动画更改。我也知道我可以使用didSelect
的{{1}}和didDeselect
方法获取所选单元格并应用动画。但我找不到任何有关上述UICollectionViewDelegate
参数如何影响动画的信息。它会以任何方式影响布局动画吗?我的目标是创建一个animated
子类,并允许使用者在内部调用上述两种方法时自定义是否应用动画。但我不知道这些方法控制的动画是什么。
答案 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)
}
}