菜鸟教程小白 发表于 2022-12-12 22:09:55

ios - 显示带有径向动画的 UIImage


                                            <p><p>我有一个 UIImageView,我想以径向顺时针方式慢慢显示。</p>

<p>这是我想如何在 1 秒内显示图像的示例。我基本上是在尝试模拟一个标记在某物周围画一个圆圈。</p>

<p> <img src="/image/Sx6py.png" alt="Radial Image Example"/> </p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>这是 <code>UIBezierPath</code> 动画的另一种变体。最重要的是,想出一个 UIBezierPath,然后用 <code>strokeEnd</code> 的 <code>CABasicAnimation</code> 对其绘图进行动画处理:</p>

<pre><code>- (void)drawBezier
{
    CGPoint startPoint = CGPointMake(self.view.frame.size.width / 2.0, 50);

    UIBezierPath *path = ;

    CAShapeLayer *oval = [ init];
    oval.path = path.CGPath;
    oval.strokeColor = .CGColor;
    oval.fillColor = .CGColor;
    oval.lineWidth = 5.0;
    oval.strokeStart = 0.0;
    oval.strokeEnd = 1.0;
    ;

    CABasicAnimation *anim = ;
    anim.duration = 1.0;
    anim.fromValue = ;
    anim.toValue = ;
    ;
}
</code></pre>

<p>您显然必须创建贝塞尔曲线。这是我复杂的小算法(它是一个由五个点组成的数组,每个点的角度,以及每个点的 anchor 的权重),但我相信你可以想出更简单的东西:</p>

<pre><code>- (UIBezierPath *)strokePath:(CGPoint)startPoint
{
    NSArray *points = [NSArray arrayWithObjects:
                     ,
                     ,
                     ,
                     ,
                     ,
                     nil];
    NSArray *angles = [NSArray arrayWithObjects:
                     ,
                     ,
                     ,
                     ,
                     ,
                     nil];
    NSArray *weight = [NSArray arrayWithObjects:
                     ,
                     ,
                     ,
                     ,
                     ,
                     nil];

    UIBezierPath *path = ;
    ;

    for (NSInteger i = 1; i &lt; 5; i++)
    {
      CGPoint pointPrevious= [ CGPointValue];
      CGPoint pointCurrent   = [ CGPointValue];

      CGFloat anglePrevious= [ floatValue];
      CGFloat angleCurrent   = [ floatValue];

      CGFloat weightPrevious = [ floatValue];
      CGFloat weightCurrent= [ floatValue];

      [path addCurveToPoint:pointCurrent
                controlPoint1:CGPointMake(pointPrevious.x + cosf(anglePrevious) * weightPrevious,
                                          pointPrevious.y + sinf(anglePrevious) * weightPrevious)
                controlPoint2:CGPointMake(pointCurrent.x- cosf(angleCurrent)* weightCurrent,
                                          pointCurrent.y- sinf(angleCurrent)* weightCurrent)];
    }

    return path;
}
</code></pre>

<p>如果这是 Not Acceptable (因为这是一条可靠的路径,而不是您的艺术渲染),这里有一个有效的技巧(但有点复杂,所以请耐心等待)。您可以将图像放在图层上,将 UIBezierPath 椭圆放在其顶部,而不是将贝塞尔路径的绘制动画为红色,将其绘制为白色,使其模糊您的图像并融入背景,然后反转动画UIBezierPath 的绘图。这样,它从您的图像开始,在其顶部绘制一个白色的 UIBezierPath,完全遮盖您的图像,并且它动画 UIBezierPath 的取消绘制,在下面显示您的图像。但无论如何,这就是您将图像添加到图层以及“取消绘制”贝塞尔曲线的方式。</p>

<pre><code>    CAShapeLayer *imagelayer = [ init];
    UIImage *image = ;
    imagelayer.contents = (id)image.CGImage;
    imagelayer.frame = CGRectMake(startPoint.x - image.size.width / 2.0, startPoint.y, image.size.width, image.size.height);
    ;

    CAShapeLayer *oval = [ init];
    oval.path = path.CGPath;
    oval.strokeColor = .CGColor;
    oval.fillColor = .CGColor;
    oval.lineWidth = 80.0;
    oval.strokeStart = 0.0;
    oval.strokeEnd = 0.0;
    ;

    CABasicAnimation *anim = ;
    anim.duration = 1.0;
    anim.fromValue = ;
    anim.toValue = ;
    ;
</code></pre>

<p>显然,必须付出一些努力才能提出直接覆盖您的图像等的 UIBezierPath,但可以做到。 (顺便说一下,如果您(a)绘制 UIBezier,(b)拍摄屏幕快照,(c)将其放入 Photoshop 中以赋予它您想要的外观,然后(d)使用用于底层图像。)无论如何,对于我下面的粗略尝试,我只是让贝塞尔曲线的厚度难以置信地厚,所以我可能会很草率,但你会想要更加小心(因为我假设你是围绕某物画你的圆圈,你不能让 UIBezierPath 覆盖遮住它)。 </p>

<p>或者,如果您想使用 CodaFi 的第一个建议,但还没有创建单独的图像,您可以坚持使用这种超厚贝塞尔路径,但您可以使用上述代码的排列来创建您的图像(例如,从 <code>strokeStart</code> 零开始,不要同时制作动画,而是拍摄屏幕快照,一次又一次地做,将 <code>strokeStart</code> 增加 1/30(或无论如何)每次,并拍摄另一个屏幕快照等)。</p>

<p>希望有人能想出一个更优雅的解决方案!</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 显示带有径向动画的 UIImage,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/11458605/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/11458605/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 显示带有径向动画的 UIImage