Я пытаюсь достичь эффекта уровня заряда батареи, используя изображение обычной батареи, изображение с обрезанным рисунком, основанное на текущем уровне заряда батареи.Обрезание и размещение изображения для достижения эффекта уровня заряда аккумулятора
На данный момент я могу изменить цвет изображения пустой батареи, но я не знаю, как обрезать, новый и поместить его поверх оригинала.
Я нашел несколько полезных ссылок о том, как обрезать, но каждый из них обрезает верхний левый угол изображения. Я хотел бы иметь в качестве начальной точки нижний левый и установить высоту в соответствии с текущим уровнем.
Кроме того, можно комбинировать или поместить обрезанное изображение поверх оригинала?
Это мое оригинальное изображение.
... и что я пытаюсь достичь
На данный момент я пытаюсь этот код,
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
обрезанная часть вытянутая
Ну начиная с нижнего левого угла означает, что, исходя из значения изображения высоты минус " высота "используемой детали. Это простая математика, определяющая ваш CGRect. – shadowhorst
Ну, я действительно понял, что сказал shadowhorst после публикации моего примера кода. Достаточно пересчитать CGRect, вычитая использованную часть, если изображение вашей зеленой батареи уже имеет форму и прозрачность. Просто не забудьте установить его contentMode на не растягивающийся. Пример, который я описал, также должен использоваться, но не оптимален, если вы не хотите использовать прозрачный зеленый прямоугольник в качестве индикатора заполнения. – basar