菜鸟教程小白 发表于 2022-12-12 09:32:38

ios - 仅水平动画 CAGradientLayer


                                            <p><p>我正在尝试为 CAGradientLayer(渐变和框架)设置动画,当我将框架设置为 0 时,它会缩小到 View 的左上角,我希望它只是动画出来水平。现在它的动画水平和垂直都为 0。 </p>

<p>这是动画当前的样子:</p>

<p> <img src="/image/pT3Dn.gif" alt="Animating CAGradientLayer"/> </p>

<p>我想要的是当它变为零时,仅水平收缩,并始终保持相同的高度。</p>

<p>这是我目前使用的代码:</p>

<pre><code>- (void)drawRect:(CGRect)rect
{
// Drawing code
if (!gradientLayer) {
    gradientLayer = ;
    ];
    ];
    ;
    ;
    ;
}
else {
    ;

    ;

    ;
    CGRect newFrame = ;
    CABasicAnimation *frameAnimation = ;
    ;
    ];
    ];
    ];
    ;
    ;
    ;
    ;

    CGPoint startPoint = CGPointMake(MIN(fillPct/100, 0.99), 0.5);
    CABasicAnimation *startPointAnimation = ;
    ;
    ];
    ];
    ];
    ;
    ;
    ;
    ;

    [CATransaction setCompletionBlock:^{
      ;
    }];

    ;
}
;
}

- (CGRect)createRectForFrame:(CGRect)frame {
if (fillPct == 0)
    return CGRectZero;
else if (fillPct &gt;= 100)
    return frame;
else
    return CGRectMake(frame.origin.x, frame.origin.y, frame.size.width * (fillPct / 100), frame.size.height);
}
</code></pre>

<p>fillPct 是条形应填充的值,介于 0 和 100 之间。</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>问题出在这一行:</p>

<pre><code>CGPoint startPoint = CGPointMake(MIN(fillPct/100, 0.99), 0.5);
</code></pre>

<p>如果你把它改成:</p>

<pre><code>CGPoint startPoint = CGPointMake(0.0, 0.5);
</code></pre>

<p>它可以随心所欲地工作 - 不会在角落收缩。</p>

<p>或者,如果您希望保留当前代码,也可以更改此值:</p>

<pre><code>CGPoint startPoint = CGPointMake(MIN(fillPct/100, 0.0), 0.5);
</code></pre>

<p>刚刚测试过;它水平动画。希望这会有所帮助。</p>

<p><strong><em>更新 1:</em></strong></p>

<p>我真的没有遇到你在评论中提到的问题;但是,我决定再看一遍。由于您没有为 <code>rect</code> 以及您一遍又一遍地调用它的方式提供任何任意值,因此我想出了自己的值并再次对其进行了测试。</p>

<p>我用这个值设置了 <code>gradientLayer</code>:</p>

<pre><code>;
</code></pre>

<p>在第一个<code>CABasicAnimation</code>中,出于测试目的,我改变了这个:</p>

<pre><code>];
</code></pre>

<p>如您所见,它与图层的矩形完全相同,只是宽度为 0.0f。想象一下,这会导致宽度为 0。</p>

<p>上述方法有效吗?是的。</p>

<p>上面的工作是否如您所愿?没有。</p>

<p>原因是这会导致框架均匀收缩 - 这不是您想要的。</p>

<p>所以,在你创建 <code>gradientLayer</code> 时添加这个:</p>

<pre><code>gradientLayer.anchorPoint = (CGPoint){0.0f, 0.5f};
</code></pre>

<p>我再次对其进行了测试,在撰写本文时它正在我面前运行。顺便看看很有趣。 </p>

<p>希望这再次对您有所帮助。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 仅水平动画 CAGradientLayer,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/23281961/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/23281961/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 仅水平动画 CAGradientLayer