15

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

アニメーションは正しく実行されますが、画像は UIImageView の tintColor の代わりに元の色 (つまり、gfx 編集アプリケーションで使用される色) を使用します。

私は自分でアニメーションを実行しようとしています (画像をループし、UIImageView の画像プロパティを NSTimer 遅延で設定して、人間の目がそれをキャッチできるようにするなど)。

それを行う前に、UIImageView の tintColor プロパティが、私がしようとしていること、つまりアニメーションに使用することをサポートすることになっているかどうかを尋ねたいと思います。

ありがとう。

4

2 に答える 2

2

自分で画像をアニメーション化するのではなく、色合いを使用して個々のフレームをレンダリングし、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」などの名前のファイルを探すことを含めて) 同様に機能しますが、色合いも取る点が異なります。

画像着色コードを提供してくれたこの回答に感謝します: https://stackoverflow.com/a/19152722/321527

于 2015-05-15T21:20:29.583 に答える
0

.tintColor はおそらくそれを処理できます。UIButton の setTitleColor メソッドには常に NSTimers を使用しています。これが例です。

更新: 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];

    }
}
于 2014-02-22T03:08:49.830 に答える