绘制无限正弦波

时间:2014-06-02 00:25:33

标签: ios cocoa-touch ios7

我尝试制作类似于此解决方案的动画正弦波: https://stackoverflow.com/a/17535290

我试图使我的正弦波连续,以便我不断地绘制相同的正弦波。在上面的解决方案中,一旦波的起始点等于帧的宽度,视图就会重新开始绘制新波。

有人可以解释下面代码中CGAffineTransformMakeTranslation(+_self_view.frame.size.width/2, 0);的作用吗?我的理解是它返回一个矩阵,将x轴向右移动一半的帧大小。我不明白这是如何导致动画做它做的事情。

-(void)animateWave {
    [UIView animateWithDuration:.5 delay:0.0 options:UIViewAnimationOptionRepeat|UIViewAnimationOptionCurveLinear animations:^{
    _self_view.transform = CGAffineTransformMakeTranslation(+_self_view.frame.size.width/2, 0);
    } completion:^(BOOL finished) {
    _self_view.transform = CGAffineTransformMakeTranslation(0, 0);
    }];
}

2 个答案:

答案 0 :(得分:7)

涉及两种观点。有“正弦波”视图,并且有正弦波视图的超视图(父级)。

假设超级视图宽320点 - iPhone屏幕的宽度。

使正弦波视图为640点,并在其中绘制两个个正弦波周期。每个周期正好是320点宽。因此,正弦波视图的左侧320点看起来与右侧320点完全相同。

现在将正弦波视图放在其超级视图中,其frame.x为-320。这意味着只能看到正弦波视图的右边320点:

initial view arrangement

现在将正弦波视图向右移动320点(宽度的一半):

animating

当动画结束时,正弦波视图的可见部分看起来与动画前可见的部分相同:

complete

如果此时您将正弦波视图重置为其初始位置(即时,没有动画),则用户将无法分辨,因为可见像素不会改变:

reset

UIViewAnimationOptionRepeat的效果是将动画参数重置为原始状态,然后开始动画。因此,如果按照我的描述排列正弦波视图及其超视图,您将获得无缝循环。

答案 1 :(得分:0)

您的理解是正确的。这里的想法是将原点放在视图的中心。试试这个,你看到有什么不同吗?

CGSize size = self.bounds.size;
CGAffineTransform translate = CGAffineTransformMakeTranslation(size.width / 2, size.height / 2);