正在重置UIView转换属性

时间:2014-08-01 20:58:14

标签: ios uiview uiviewanimation

我有一个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触摸方法,但是观察到相同的行为。即使我删除了向上扩展方法以便永远不会调用它,也会发生突然放大,因此我的缩小不会被放大动画取消。我可以通过日志语句看到我的缩小被调用一次,动画完成块被调用finsished == YES。在调用完成块之前,单元格将被缩放(我已将动画持续时间设置为超长以帮助调试)。这似乎发生在我触摸单元格然后快速滚动时,所以我猜滚动与它有关。

1 个答案:

答案 0 :(得分:1)

问题是你正在劫持"突出显示"对于它不是的东西。突出显示是一项复杂而令人困惑的业务。在被点击和选择的过程中,单元格不止一次地突出显示和不加亮。因此,回应是错误的。

如果您要检测的是触摸,那么您应该回复触摸。如果手势识别器不能做,那么使用您自己的单元子类,以便您可以直接实现UITouch检测。

要记住的另一件事是,你写这个的方式,如果在缩小比例正在进行时放大,它就会把它杀死。

编辑 - 最后一个想法 - 在您的编辑中,您对滚动与此有关的内容发表评论。那讲得通。想一想集合视图布局是如何工作的 - it 负责每个单元格的属性,包括其变换https://developer.apple.com/library/ios/documentation/uikit/reference/UICollectionViewLayoutAttributes_class/Reference/Reference.html)。因此,如果您自己更改单元格的变换,并且不告诉布局,并且布局需要充电,那么它将取消您的变换。