0

現在のバッテリーレベルに基づいて、プレーンなバッテリー画像に別のトリミングされた画像を描画することにより、バッテリーレベルの効果を達成しようとしています。

現時点では、空のバッテリー画像の色を変更することはできますが、新しい画像を切り取って元の画像の上に配置する方法がわかりません。

トリミング方法に関する便利なリンクをいくつか見つけましたが、それらのすべてが画像の左上隅からトリミングされています。左下を出発点として、現在のレベルに応じて高さを設定したいと思います。

また、切り抜いた画像をオリジナルの上に合成したり、重ねたりすることは可能ですか?

これが私の元の画像です。

ここに画像の説明を入力

...そして私が達成しようとしていること

ここに画像の説明を入力

現時点では、このコードを試していますが、

int width = emptyBm.size.width;
int height = fullBm.size.height * level / 100;

UIImage *image = [UIImage imageNamed:@"battery_icon"];
UIImage *image2 = [UIImage imageNamed:@"battery_icon_full"];

CGRect rect = CGRectMake(0, image.size.height-height, width, height);
CGImageRef imageRef = CGImageCreateWithImageInRect([image2 CGImage], rect);

CGImageRef actualMask = CGImageMaskCreate(CGImageGetWidth([image CGImage]),
                                              CGImageGetHeight([image CGImage]),
                                              CGImageGetBitsPerComponent([image CGImage]),
                                              CGImageGetBitsPerPixel([image CGImage]),
                                              CGImageGetBytesPerRow([image CGImage]),
                                              CGImageGetDataProvider([image CGImage]), NULL, false);
CGImageRef masked = CGImageCreateWithMask(imageRef, actualMask);

batteryBackground.image = [UIImage imageWithCGImage:masked];

ただ、CGImageCreateWithImageInRectトリミングした部分が伸びて使っているので

4

1 に答える 1

2

灰色のバッテリー イメージをマスクとして使用します。緑色の長方形を作成し、作成したマスクを適用します。iOS マスキングへのリンクは次のとおりです。

編集: これが機能することを願っています(テストされていません):

int width = emptyBm.size.width;
int height = fullBm.size.height * level / 100;

UIImage *image = [UIImage imageNamed:@"battery_icon"];
UIImage *image2 = [UIImage imageNamed:@"battery_icon_full"];

// For clarity, just pretend the mask method I gave link to you is defined in your class.
UIImage *maskedImage = [self maskImage:image2 withMask:image];

// I assume the two imageviews are already connected to outlets.
self.backgroundImageView = [[UIImageView alloc] initWithImage:image];
self.foregroundImageView = [[UIImageView alloc] initWithImage:maskedImage];

// Make it's image stick to bottom so it won't stretch.
self.foregroundImageView.contentMode = UIViewContentModeBottom;

// Then calculate the frame again to reflect changes of battery status.
CGRect rect = self.backgroundImageView.frame;
rect.size.height = height;
// Push the masked imageview a to bottom as amount of missing battery height.
rect.origin.y = rect.origin.y + self.backgroundImageView.frame.size.height - height;
self.foregroundImageView.frame = rect;
于 2013-07-11T12:05:34.523 に答える