在动画期间进行UIView缩放

tcu*_*rdt 6 iphone cocoa-touch core-animation uikit

我有一个自定义UIView来显示平铺图像.

    - (void)drawRect:(CGRect)rect
    {
        ...
        CGContextRef context = UIGraphicsGetCurrentContext();       
        CGContextClipToRect(context,
             CGRectMake(0.0, 0.0, rect.size.width, rect.size.height));      
        CGContextDrawTiledImage(context, imageRect, imageRef);
        ...
    }
Run Code Online (Sandbox Code Playgroud)

现在我试图为该视图的大小调整设置动画.

[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.3];

// change frame of view

[UIView commitAnimations];
Run Code Online (Sandbox Code Playgroud)

我期望的是平铺区域只是增长,使瓷砖尺寸保持不变.相反,当区域增长时,视图的原始内容将缩放到新大小.至少在动画期间.所以在动画的开头和结尾都很好.在动画期间,瓷砖会扭曲.

为什么CA试图扩展?我怎么能阻止它这样做?我错过了什么?

dun*_*cox 15

如果Core Animation必须为每个动画帧回调你的代码,它将永远不会像现在这样快,并且自定义属性的动画一直是Mac上CA的长期请求功能和常见问题解答.

使用UIViewContentModeRedraw是在正确的轨道上,也是你从CA获得的最好的.问题是从UIKit的角度来看,框架只有两个值:转换开始时的值和转换结束时的值,这就是你所看到的.如果查看Core Animation体系结构文档,您将看到CA如何拥有所有图层属性的私有表示,并且它们的值随时间而变化.这就是帧插值发生的地方,并且当它们发生时你无法得到通知.

所以唯一的方法是使用NSTimer(或performSelector:withObject:afterDelay:)随着时间的推移改变视图框架,这是老式的方式.