我正在尝试将UIDynamics
添加到自定义UICollectionViewFlowLayout
我希望dynamicAnimator
在滚动时为每个单元格制作动画。他们应该以更现实的方式行事,就像iMessage泡沫一样。他们似乎对滚动时施加给他们的物理力做出反应。我希望dynamicAnimator
以同样的方式为我的单元格设置动画。我知道dynamicAnimator
会很快改变细胞的中心,并很快产生施加在细胞上的物理力量的幻觉。我找到了一个教程,解释了如何使用UICollectionView
和UIKit Dynamics
tutorial with example project来完成此操作。我理解本教程的每一步。
我上传了一张图片,以阐明我想要实现的目标。请参阅image(我的声誉不够高,无法发布图片)。在教程之后将产生一个看起来有点像布局(2)的布局。这非常接近我想要的。但是,我想改变一件事:细胞集中在collectionView上。我希望单元格的初始中心与布局(1)相同,而不是布局(2)。
在使用dynamicAnimator之前,我在layoutAttributesForItemAtIndexPath
- 方法中设置了单元格的中心。但是,我需要找到一种方法来通知dynamicAnimator单元格的中心不是布局(2),而是布局(1)。显然,我不知道如何融合来自布局的信息和来自动画师的信息。
因此,我会尝试重新解释我的问题。如何融化来自布局的信息和来自动画师的信息?
要包含一些代码:如何使上面的教程中的示例看起来更像布局(2)(因此如何更改单元格的初始中心)?我在哪里告诉dynamicAnimator细胞中心应该在哪里?
项目可以在上面教程的开头找到,名为ASHSpringyCollectionView
,结果就像布局(2)。
// 以下是问题的初始版本。我重写了它以获得更清晰(重写此部分之上的所有内容)。为了完整起见,我在这里保留了这个旧版本的问题。
我正在尝试将UIDynamics
添加到自定义UICollectionViewFlowLayout
。我正在使用piemonte的自定义UICollectionViewFlowLayout
PBJHexagon它创建了一个漂亮的六边形布局。但是,为了实现这种特殊的布局,他改变了“layoutAttributesForItemAtIndexPath
”方法中的单元格中心:
- (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath
{
NSInteger row = (NSInteger) CGFloat_nearbyint( CGFloat_floor(indexPath.row / _itemsPerRow) );
NSInteger col = indexPath.row % _itemsPerRow;
CGFloat horiOffset = ((row % 2) != 0) ? 0 : self.itemSize.width * 0.5f;
CGFloat vertOffset = 0;
UICollectionViewLayoutAttributes *attributes = [UICollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath:indexPath];
attributes.size = self.itemSize;
attributes.center = CGPointMake( ( (col * self.itemSize.width) + (0.5f * self.itemSize.width) + horiOffset),
( ( (row * 0.75f) * self.itemSize.height) + (0.5f * self.itemSize.height) + vertOffset) );
return attributes;
}
这就像一个魅力。但是,我想将UIKit
Dynamics添加到我的应用中,以使其更具吸引力并创造更好的整体体验。
我在objc.io上发了一篇名为'UICollectionView + UIKIT Dynamics'的精彩教程。根据教程,我必须改变这样的方法:
-(UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath
{
return [self.dynamicAnimator layoutAttributesForCellAtIndexPath:indexPath];
}
这样做要求我替换计算单元格中心的代码。
我上传了一张图片来澄清它的样子。请参阅上图(我的声誉不够高,无法发布图片)。我通过将上面的代码添加到MyCollectionViewController
中的以下方法,在左侧(1)实现了布局。但是,一旦我开始滚动,布局就会变回布局(2)(也有一些丑陋的闪烁)。我想这是因为dynamicAnimator处于控制之中并使用看起来更像layout(2)的layoutAttributes。
问题在于我不知道如何告诉dynamicAnimator
单元格的初始位置是什么,以及它不应该使用标准的FlowLayout中心。
MyCollectionViewController
中创建正确布局的方法..直到第一次滚动操作发生:
-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:CellIdentifier forIndexPath:indexPath];
NSInteger row = (NSInteger) CGFloat_nearbyint( CGFloat_floor(indexPath.row / 2) ); // 2 = itemsPerRow
NSInteger col = indexPath.row % 2; // 2 = itemsPerRow
CGFloat horiOffset = ((row % 2) != 0) ? 0 : 60.f * 0.5f;
CGFloat vertOffset = 0;
cell.center = CGPointMake( ( (col * 125.0f) + (0.5f * 125.0f) + horiOffset),
( ( (row * 0.75f) * 125.0f) + (0.5f * 125.0f) + vertOffset) );
cell.backgroundColor = [UIColor orangeColor];
return cell;
}
毕竟,我的问题是如何使布局(1)始终使用的永久布局。因此,如何使dynamicAnimator使用布局(1)而不是布局(2)?
答案 0 :(得分:0)
你所做的事情毫无意义。您的代码显示了layoutAttributesForItemAtIndexPath:
的两个实现。那是胡说八道。只能有一个。
将动态动画师添加到集合视图布局是一项复杂而微妙的业务 - 对初学者来说不是什么。
首先,只有在你实际上是动画的时候,你才能吸引动态动画师。有些时候你是动画片,有些时候你不是动画片。你没有给出动画的时间或理由,因此完全不清楚你想要动画的内容和时间。
其次,您必须合并来自布局的信息和来自动画师的信息,仅用于实际动画的那些项目。
< / LI>你没有做那样的事情,所以当然你的结果很奇怪。