我有一个 UICollectionView。我想要一种行为,当用户触摸一个单元格时,它会按比例缩小,就好像它被稍微向下推了一样。我通过使用 UICollectionViewDelegate 方法完成了此操作:
- (void)collectionView:(UICollectionView *)collectionView didHighlightItemAtIndexPath:(NSIndexPath *)indexPath
{
UICollectionViewCell *cell = [collectionView cellForItemAtIndexPath:indexPath];
[self scaleDownCell:cell];
}
- (void) collectionView:(UICollectionView *)collectionView didUnhighlightItemAtIndexPath:(NSIndexPath *)indexPath{
UICollectionViewCell *cell = [collectionView cellForItemAtIndexPath:indexPath];
[self scaleUpCell:cell];
}
我的问题是,有时我的单元格会开始缩小,然后突然恢复到完整大小,而不执行放大动画,从而产生抖动效果。在调用我的放大方法之前,我已经检查了它放大的断点。我想找出原因。
尺度函数如下:
+ (void)scaleDownCell:(UICollectionViewCell *)cell
{
CGAffineTransform transform = CGAffineTransformMakeScale(0.95, 0.95);
[UIView animateWithDuration:SCALE_DOWN_ANIMATION_DURATION
delay:0.0
usingSpringWithDamping:SCALE_DOWN_SPRING_DAMPING
initialSpringVelocity:SCALE_DOWN_SPRING_VELOCITY
options:0
animations:^{
cell.transform = transform;
}
completion:^(BOOL finished) {
}];
}
+ (void)scaleUpCell:(UBCollectionViewCell *)cell
{
CGAffineTransform transform = CGAffineTransformMakeScale(1.0, 1.0);
[UIView animateWithDuration:SCALE_UP_ANIMATION_DURATION
delay:0.3
usingSpringWithDamping:SCALE_UP_SPRING_DAMPING
initialSpringVelocity:SCALE_UP_SPRING_VELOCITY
options:0
animations:^{
cell.transform = transform;
}
completion:^(BOOL finished) {
}];
}
编辑:我基本上想用这种缩放行为替换我的单元格中的突出显示,它的目的完全相同,我希望它发生在与单元格突出显示完全相同的情况下,所以它看起来是一个合适的地方应用我的转变。
无论如何,我首先尝试覆盖单元格子类中的 UIResponder 触摸方法,但观察到相同的行为。即使我删除放大方法以使其永远不会被调用,也会突然放大,因此放大动画不会取消我的缩小。我可以通过日志语句看到我的比例缩小被调用了一次,动画完成 block 被调用为 finished == YES。在调用完成 block 之前,单元格正在按比例缩小(我已将动画持续时间设置为超长以帮助调试)。这似乎是在我触摸单元格然后快速滚动时发生的,所以我猜滚动与它有关。
最佳答案
问题是您劫持了“突出显示”的概念,而实际上并非如此。突出显示是一项复杂而困惑的业务。在被点击和选择的过程中,单元格不止一次高亮和取消高亮。因此,这是错误的回应。
如果您要检测的是触摸,那么您应该响应触摸。如果手势识别器不起作用,则使用您自己的单元格子类,以便您可以直接实现 UITouch 检测。
还有一件事要记住,按照你写这篇文章的方式,如果在缩小过程中发生放大,它只会杀死它。
编辑 - 最后一个想法 - 在您的编辑中,您发表了关于滚动与此有关的评论。这就说得通了。想一想 Collection View 布局的工作原理 - 它 负责每个单元格的属性,包括它的转换 ( https://developer.apple.com/library/ios/documentation/uikit/reference/UICollectionViewLayoutAttributes_class/Reference/Reference.html )。所以很自然地,如果您自己更改单元格的转换,并且您不告诉布局,而布局负责,它会取消您的转换。
关于ios - 正在重置 UIView 转换属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25088595/