Sie können ein animiertes GIF mit dem Image I / O-Framework (das Teil des iOS SDK ist) erstellen. Sie möchten auch das MobileCoreServicesFramework einschließen , das die GIF-Typkonstante definiert. Sie müssen diese Frameworks zu Ihrem Ziel hinzufügen und ihre Header in die Datei importieren, in der Sie das animierte GIF erstellen möchten.
#import <ImageIO/ImageIO.h>
#import <MobileCoreServices/MobileCoreServices.h>
Es ist am einfachsten, dies anhand eines Beispiels zu erklären. Ich zeige Ihnen den Code, mit dem ich dieses GIF auf meinem iPhone 5 erstellt habe:

Hier ist zunächst eine Hilfsfunktion, die eine Größe und einen Winkel annimmt und eine UIImageder roten Scheiben in diesem Winkel zurückgibt :
static UIImage *frameImage(CGSize size, CGFloat radians) {
UIGraphicsBeginImageContextWithOptions(size, YES, 1); {
[[UIColor whiteColor] setFill];
UIRectFill(CGRectInfinite);
CGContextRef gc = UIGraphicsGetCurrentContext();
CGContextTranslateCTM(gc, size.width / 2, size.height / 2);
CGContextRotateCTM(gc, radians);
CGContextTranslateCTM(gc, size.width / 4, 0);
[[UIColor redColor] setFill];
CGFloat w = size.width / 10;
CGContextFillEllipseInRect(gc, CGRectMake(-w / 2, -w / 2, w, w));
}
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
}
Jetzt können wir das GIF erstellen. Zuerst definieren wir eine Konstante für die Anzahl der Frames, da wir sie später zweimal benötigen:
static void makeAnimatedGif(void) {
static NSUInteger const kFrameCount = 16;
Wir benötigen ein Eigenschaftswörterbuch, um anzugeben, wie oft die Animation wiederholt werden soll:
NSDictionary *fileProperties = @{
(__bridge id)kCGImagePropertyGIFDictionary: @{
(__bridge id)kCGImagePropertyGIFLoopCount: @0,
}
};
Und wir benötigen ein weiteres Eigenschaftswörterbuch, das wir jedem Frame anhängen und angeben, wie lange dieser Frame angezeigt werden soll:
NSDictionary *frameProperties = @{
(__bridge id)kCGImagePropertyGIFDictionary: @{
(__bridge id)kCGImagePropertyGIFDelayTime: @0.02f,
}
};
Wir erstellen auch eine URL für das GIF in unserem Dokumentenverzeichnis:
NSURL *documentsDirectoryURL = [[NSFileManager defaultManager] URLForDirectory:NSDocumentDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:YES error:nil];
NSURL *fileURL = [documentsDirectoryURL URLByAppendingPathComponent:@"animated.gif"];
Jetzt können wir ein erstellen CGImageDestination, das ein GIF an die angegebene URL schreibt:
CGImageDestinationRef destination = CGImageDestinationCreateWithURL((__bridge CFURLRef)fileURL, kUTTypeGIF, kFrameCount, NULL)
CGImageDestinationSetProperties(destination, (__bridge CFDictionaryRef)fileProperties)
Ich entdeckte , dass Passieren filePropertiesder als letztes Argument CGImageDestinationCreateWithURLtut nicht Arbeit. Du musst benutzen CGImageDestinationSetProperties.
Jetzt können wir unsere Frames erstellen und schreiben:
for (NSUInteger i = 0; i < kFrameCount; i++) {
@autoreleasepool {
UIImage *image = frameImage(CGSizeMake(300, 300), M_PI * 2 * i / kFrameCount);
CGImageDestinationAddImage(destination, image.CGImage, (__bridge CFDictionaryRef)frameProperties);
}
}
Beachten Sie, dass wir das Frame-Eigenschaften-Wörterbuch zusammen mit jedem Frame-Bild übergeben.
Nachdem wir genau die angegebene Anzahl von Frames hinzugefügt haben, finalisieren wir das Ziel und geben es frei:
if (!CGImageDestinationFinalize(destination)) {
NSLog(@"failed to finalize image destination");
}
CFRelease(destination);
NSLog(@"url=%@", fileURL);
}
Wenn Sie dies auf dem Simulator ausführen, können Sie die URL von der Debug-Konsole kopieren und in Ihren Browser einfügen, um das Bild anzuzeigen. Wenn Sie es auf dem Gerät ausführen, können Sie im Xcode Organizer-Fenster die App-Sandbox vom Gerät herunterladen und das Bild anzeigen. Oder Sie können eine solche App verwenden iExplorer, mit der Sie das Dateisystem Ihres Geräts direkt durchsuchen können. (Dies erfordert kein Jailbreaking.)
Ich habe dies auf meinem iPhone 5 mit iOS 6.1 getestet, aber ich glaube, der Code sollte bereits unter iOS 4.0 funktionieren.
Ich habe den gesamten Code zum einfachen Kopieren in diese Liste aufgenommen .