ios - 正在重置 UIView 转换属性

标签 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 触摸方法,但观察到相同的行为。即使我删除放大方法以使其永远不会被调用,也会突然放大,因此放大动画不会取消我的缩小。我可以通过日志语句看到我的比例缩小被调用了一次,动画完成 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/

相关文章:

iphone - "pointInside:"是如何工作的?

objective-c - 当键盘出现在 iOS 中时,将 UIView 上移

ios - 如何将圆形蒙版添加到 UIImageview 并同时更改框架和中心?

ios - Mvvm交叉/Xamarin "This class is not key value coding-compliant for the key"

ios - 是否可以声明类似 lambda 函数的东西,UIAlert 中的 OK 按钮将执行什么操作?

ios - 将屏幕截图保存到沙箱

ios - 带有自动反转的 UIView 动画

objective-c - 将标签栏应用程序与导航 Controller 一起使用

objective-c - 在 addSubview 之后更改 View ,什么是好的做法?

ios - CAAnimation层取消了 View 的先前变换