Ответ 1
Вы можете создать анимированный GIF, используя среду ввода-вывода изображения (которая является частью SDK iOS). Вы также захотите включить структуру MobileCoreServices
, которая определяет константу типа GIF. Вам нужно добавить эти рамки в свою цель и импортировать их заголовки в файл, в котором вы хотите создать анимированный GIF, например:
#import <ImageIO/ImageIO.h>
#import <MobileCoreServices/MobileCoreServices.h>
Проще всего объяснить на примере. Я покажу вам код, который я использовал для создания этого GIF на моем iPhone 5:
Во-первых, здесь вспомогательная функция, которая принимает размер и угол и возвращает UIImage
красного диска под этим углом:
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;
}
Теперь мы можем создать GIF. Сначала мы определим константу для числа кадров, потому что мы нуждаемся в ней два раза позже:
static void makeAnimatedGif(void) {
static NSUInteger const kFrameCount = 16;
Нам понадобится словарь свойств, чтобы указать количество повторений анимации:
NSDictionary *fileProperties = @{
(__bridge id)kCGImagePropertyGIFDictionary: @{
(__bridge id)kCGImagePropertyGIFLoopCount: @0, // 0 means loop forever
}
};
И нам понадобится еще один словарь свойств, который мы будем прикреплять к каждому кадру, указав, как долго должен отображаться этот кадр:
NSDictionary *frameProperties = @{
(__bridge id)kCGImagePropertyGIFDictionary: @{
(__bridge id)kCGImagePropertyGIFDelayTime: @0.02f, // a float (not double!) in seconds, rounded to centiseconds in the GIF data
}
};
Мы также создадим URL-адрес для GIF в каталоге наших документов:
NSURL *documentsDirectoryURL = [[NSFileManager defaultManager] URLForDirectory:NSDocumentDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:YES error:nil];
NSURL *fileURL = [documentsDirectoryURL URLByAppendingPathComponent:@"animated.gif"];
Теперь мы можем создать CGImageDestination
, который записывает GIF в указанный URL:
CGImageDestinationRef destination = CGImageDestinationCreateWithURL((__bridge CFURLRef)fileURL, kUTTypeGIF, kFrameCount, NULL);
CGImageDestinationSetProperties(destination, (__bridge CFDictionaryRef)fileProperties);
Я обнаружил, что передача fileProperties
в качестве последнего аргумента CGImageDestinationCreateWithURL
работает не. Вы должны использовать CGImageDestinationSetProperties
.
Теперь мы можем создавать и писать наши фреймы:
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);
}
}
Обратите внимание, что мы передаем словарь свойств кадра вместе с каждым изображением кадра.
После того, как мы добавили точно указанное количество кадров, мы завершаем назначение и освобождаем его:
if (!CGImageDestinationFinalize(destination)) {
NSLog(@"failed to finalize image destination");
}
CFRelease(destination);
NSLog(@"url=%@", fileURL);
}
Если вы запустите это на симуляторе, вы можете скопировать URL-адрес из консоли отладки и вставить его в свой браузер, чтобы увидеть изображение. Если вы запустите его на устройстве, вы можете использовать окно Xcode Organizer для загрузки песочницы приложений с устройства и просмотра изображения. Или вы можете использовать приложение типа iExplorer
, которое позволяет напрямую просматривать файловую систему вашего устройства. (Это не требует джейлбрейка.)
Я тестировал это на своем iPhone 5 под управлением iOS 6.1, но я считаю, что код должен работать еще в IOS 4.0.
Я положил весь код в этот смысл для легкого копирования.