how to repeat animation forever in Swift (HUGE_VALF)?

15,818

Solution 1

Set the repeatCount to Float.infinity. This compiles and works.

In all probability, HUGE_VALF was a legacy value in any case.

Still, it's a bit of a surprise that these numeric constant names are not seen by Swift. I did try importing <stdlib.h> in the bridging header but it didn't help.


But please see now Martin R's answer. Since the time when I posted my answer, Apple has stated their preferred answer explicitly: use .greatestFiniteMagnitude. It is almost the same thing as .infinity but not quite!

Solution 2

The current documentation for the repeatCount property of CAMediaTiming states:

Setting this property to greatestFiniteMagnitude will cause the animation to repeat forever.

And that compiles without problems:

let ba = CABasicAnimation()
ba.repeatCount = .greatestFiniteMagnitude

The reason that HUGE_VALF is not imported into Swift is that it is defined as a "non-trivial" macro in <math.h>:

#   define    HUGE_VALF    __builtin_huge_valf()
Share:
15,818
matt
Author by

matt

Author most recently of iOS 15 Programming Fundamentals with Swift and of Programming iOS 14. Code examples from the books available at my github repository. A much earlier edition, Programming iOS 6, is available to read for free at http://www.apeth.com/iOSBook/. And the Swift language chapters of iOS 10 Programming Fundamentals With Swift are available at http://www.apeth.com/swiftBook/.

Updated on June 02, 2022

Comments

  • matt
    matt almost 2 years

    According to the docs, the way to repeat a CABasicAnimation forever is to set its repeatCount to HUGE_VALF.

    But in Swift, HUGE_VALF causes a compile error. Swift doesn't seem to know about the standard library (or wherever this constant resides).

    What do I do now?

  • Mick MacCallum
    Mick MacCallum almost 10 years
    Good find. I believe you meant repeatCount in both Q&A though?
  • matt
    matt almost 10 years
    I didn't mean that, in the sense that my code was in fact setting repeatDuration to HUGE_VALF. But I probably should have meant that! I'll adjust.
  • Martin R
    Martin R almost 10 years
    HUGE_VALF is defined in <math.h>. But even it that file is added to the bridging header file, this constant is not exposed to Swift.
  • matt
    matt almost 10 years
    @MartinR And why is that? That's what I don't understand. It's just lucky I found another approach...