SORU
16 ŞUBAT 2013, CUMARTESİ


Oluşturun ve iOS) animasyonlu gif ihracat?

Basit bir animasyon olan bir iOS uygulaması içinde kullanıcı için özelleştirilmiş bir dizi resim, çerçeve, flip kitap tarzı var.

Bu benim sorum: bir şekilde kullanıcılarına animasyonlu gif olarak kendi animasyon vermek için izin var mı? İdeal olarak, onları, sosyal paylaşım (T/A) E-posta etkinleştirmek veya (en kötü durum..) iTunes üzerinden alım belgelerini klasör için bir animasyonlu gif kaydetmek istiyorum.

Bir Nasıl kurtaracağımı biliyorum .png fotoğraf arşivi ve buldum bir şekilde kaydetmek için bir animasyon gibi bir QT dosyası (http://www.cimgf.com/2009/02/03/record-your-core-animation-animation/), ama bulamadım henüz bir yol için sadece dışarı bir düz eski animasyonlu gif. Temel Animasyon içinde bir şeyler mi kaçırdım yoksa başka bir yerde mi? Herhangi yaklaşımlar, çerçeveler, ya da kimseye tavsiye edebileceği kaynaklar var mı? Kusura bakmayın eğer bu soru genel bir başlangıç noktası bulmak için mücadele ediyor. Herhangi bir yardım için teşekkür ederiz.

CEVAP
16 ŞUBAT 2013, CUMARTESİ


Hareketli bir GİF O çerçeve iOS SDK bir parçası olan) I/Görüntü kullanarak oluşturabilirsiniz. Ayrıca GİF türü sabit tanımlar MobileCoreServices çerçeve, dahil etmek isteyeceksiniz. Animasyonlu GİF, bu gibi oluşturmak istediğiniz hedef için bu çerçeveler eklemek gerekir, ve bu dosya kendi başlıklarını alma:

#import <ImageIO/ImageIO.h>
#import <MobileCoreServices/MobileCoreServices.h>

En kolay örnekle açıklayacak. Benim iPhone 5'te bu GİF yapmak için kullanılan kod göstereyim:

animated GIF created by the code shown

İlk olarak, burada bir büyüklük ve bir açı alır ve bu açıyla UIImage kırmızı bir disk döndüren bir yardımcı işlevi:

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;
}

Şimdi GİF oluşturabilirsiniz. İlk iki kez daha ihtiyacımız var çünkü kare sayısı için bir sabit tanımlayın.

static void makeAnimatedGif(void) {
    static NSUInteger const kFrameCount = 16;

Animasyon tekrarlayayım sayısını belirtmek için özellik bir sözlük lazım:

    NSDictionary *fileProperties = @{
        (__bridge id)kCGImagePropertyGIFDictionary: @{
            (__bridge id)kCGImagePropertyGIFLoopCount: @0, // 0 means loop forever
        }
    };

Ve her çerçeve için ekliyoruz başka bir özelliği sözlük, bu karenin nasıl gösterileceğini belirtme ihtiyacımız var:

    NSDictionary *frameProperties = @{
        (__bridge id)kCGImagePropertyGIFDictionary: @{
            (__bridge id)kCGImagePropertyGIFDelayTime: @0.02f, // a float (not double!) in seconds, rounded to centiseconds in the GIF data
        }
    };

Ayrıca belgeleri bizim dizin: GİF için bir URL yaratırız

    NSURL *documentsDirectoryURL = [[NSFileManager defaultManager] URLForDirectory:NSDocumentDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:YES error:nil];
    NSURL *fileURL = [documentsDirectoryURL URLByAppendingPathComponent:@"animated.gif"];

Şimdi belirtilen URL: GİF yazan CGImageDestination yaratabiliriz

    CGImageDestinationRef destination = CGImageDestinationCreateWithURL((__bridge CFURLRef)fileURL, kUTTypeGIF, kFrameCount, NULL);
    CGImageDestinationSetProperties(destination, (__bridge CFDictionaryRef)fileProperties);

CGImageDestinationCreateWithURL en son bağımsız değişken olarak fileProperties geçen yok olduğunu keşfettimdeğiliş. CGImageDestinationSetProperties kullanmak zorunda.

Şimdi ve çerçeve oluşturmak yazabiliriz:

    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);
        }
    }

Her kare görüntü ile birlikte çerçeve özellikleri sözlük geçiyoruz unutmayın.

Tam olarak belirtilen kare sayısı ekledik sonra, biz hedef sonuçlandırmak ve bırakın:

    if (!CGImageDestinationFinalize(destination)) {
        NSLog(@"failed to finalize image destination");
    }
    CFRelease(destination);

    NSLog(@"url=%@", fileURL);
}

Seni simülatörü çalıştırın, hata ayıklama konsolu ve tarayıcınıza bu fotoğrafı görmek yapıştır URL kopyalayabilirsiniz. Bu aygıt üzerinde çalıştırmak, böyle büyük mükafat Düzenleyicisi penceresi cihazdan app sanal indirme ve resim bakmak için kullanabilirsiniz. Veya cihazınızın dosya sistemine doğrudan dolaşabilirsiniz iExplorer gibi bir uygulama kullanabilirsiniz. (Bu jailbreak gerektirmez.)

Çalışan 6.1, ancak kod kadar geri iOS gibi çalışması gerektiğine inanıyorum benim iPhone 5 iOS 4.0 üzerinde test edilmiştir.

Kolay kopyalama this gist tüm kodu koydum.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • David MeShow

    David MeShow

    10 EKİM 2006
  • HowtoDrawAndPaint

    HowtoDrawAnd

    24 EKİM 2010
  • Maschine Tutorials

    Maschine Tut

    15 ŞUBAT 2011