Ви можете створити анімований GIF, використовуючи фреймворк вводу-виводу зображень (який є частиною SDK для iOS). Ви також захочете включити MobileCoreServices
структуру, яка визначає константу типу GIF. Вам потрібно додати ці фреймворки до своєї цілі та імпортувати їх заголовки у файл, де ви хочете створити анімований GIF, наприклад:
#import <ImageIO/ImageIO.h>
#import <MobileCoreServices/MobileCoreServices.h>
Найпростіше пояснити на прикладі. Я покажу вам код, який я використовував для створення цього GIF на своєму iPhone 5:
По-перше, ось допоміжна функція, яка приймає розмір і кут і повертає a 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,
}
};
І нам знадобиться ще один словник властивостей, який ми прикріпимо до кожного кадру, вказуючи, як довго цей кадр повинен відображатися:
NSDictionary *frameProperties = @{
(__bridge id)kCGImagePropertyGIFDictionary: @{
(__bridge id)kCGImagePropertyGIFDelayTime: @0.02f,
}
};
Ми також створимо 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.
Я вклав увесь код у цей суть для зручного копіювання.