Можно ли использовать новое свойство tintColor для UIImageview в iOS 7 для анимации изображений?

tintColor - это спасатель жизни, он требует применения приложения на совершенно новом (легком) уровне.

//the life saving bit is the new UIImageRenderingModeAlwaysTemplate mode of UIImage
UIImage *templateImage = [[UIImage imageNamed:@"myTemplateImage"] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
imageView.image = templateImage;

//set the desired tintColor
imageView.tintColor = color;

Вышеприведенный код "накрасит" изображение непрозрачными частями в соответствии с цветом оттенка UIImageview, который так крут. Нет необходимости в базовой графике для чего-то простого.

Проблема, с которой я сталкиваюсь, - это анимация.

Продолжая описанный выше код:

//The array with the names of the images we want to animate
NSArray *imageNames = @[@"1",@"2"@"3"@"4"@"5"];

//The array with the actual images
NSMutableArray *images = [NSMutableArray new];
for (int i = 0; i < imageNames.count; i++)
{
    [images addObject:[[UIImage imageNamed:[imageNames objectAtIndex:i]] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]];
}

//We set the animation images of the UIImageView to the images in the array
imageView.animationImages = images;

//and start animating the animation
[imageView startAnimating];

Анимация выполняется правильно, но изображения используют исходный цвет (т.е. цвет, используемый в приложении редактирования gfx), а не tintColor UIImageView.

Я собираюсь сам выполнить анимацию (сделав что-то немного сверху, как прокручивание изображений и установив свойство изображения UIImageView с задержкой NSTimer, чтобы человеческий глаз мог ее поймать).

Прежде чем это сделать, я хотел бы спросить, должно ли свойство tintColor UIImageView поддерживать то, что я пытаюсь сделать с ним, и использовать его для анимаций.

Спасибо.

Ответ 1

Вместо того, чтобы анимировать изображения самостоятельно, я решил отобразить отдельные кадры с использованием цвета оттенков, а затем позволить UIImage сделать анимацию. Я создал категорию в UIImage следующими способами:

+ (instancetype)animatedImageNamed:(NSString *)name tintColor:(UIColor *)tintColor duration:(NSTimeInterval)duration
{
    NSMutableArray *images = [[NSMutableArray alloc] init];

    short index = 0;
    while ( index <= 1024 )
    {
        NSString *imageName = [NSString stringWithFormat:@"%@%d", name, index++];
        UIImage *image = [UIImage imageNamed:imageName];
        if ( image == nil ) break;

        [images addObject:[image imageTintedWithColor:tintColor]];
    }

    return [self animatedImageWithImages:images duration:duration];
}

- (instancetype)imageTintedWithColor:(UIColor *)tintColor
{
    CGRect imageBounds = CGRectMake( 0, 0, self.size.width, self.size.height );

    UIGraphicsBeginImageContextWithOptions( self.size, NO, self.scale );
    CGContextRef context = UIGraphicsGetCurrentContext();

    CGContextTranslateCTM( context, 0, self.size.height );
    CGContextScaleCTM( context, 1.0, -1.0 );
    CGContextClipToMask( context, imageBounds, self.CGImage );

    [tintColor setFill];
    CGContextFillRect( context, imageBounds );

    UIImage *tintedImage = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

    return tintedImage;
}

Он работает так же, как + [UIImage animatedImageNamed:duration:] (включая поиск файлов с именем "image0", "image1" и т.д.), за исключением того, что он также принимает цвет оттенка.

Благодаря этому ответу для предоставления кода тонирования изображения: fooobar.com/questions/114689/...

Ответ 2

.tintColor, возможно, справится с этим. Я все время использую NSTimers для UIButton setTitleColor. Вот пример.

ОБНОВЛЕНО: Протестировано и работает на iPhone 5s iOS 7.1!

- (void)bringToMain:(UIImage *)imageNam {

    timer = [NSTimer scheduledTimerWithTimeInterval:.002
                                            target:self
                                          selector:@selector(animateTint)
                                          userInfo:nil
                                           repeats:YES];
} 

- (void)animateTint {

    asd += 1.0f;

    [imageView setTintColor:[UIColor colorWithRed:((asd/100.0f) green:0.0f blue:0.0f alpha:1.0f]];

if (asd == 100) {

        asd = 0.0f

        [timer invalidate];

    }
}