Я знаю, что можно тонировать прямоугольное изображение, рисуя поверх него CGContextFillRect и устанавливая режим наложения. Однако я не могу понять, как сделать оттенок на прозрачном изображении, таком как значок. Это должно быть возможно, так как SDK делает это на вкладках таким образом. Сможет ли кто-нибудь предоставить фрагмент?
ОБНОВЛЕНИЕ:
Много полезных предложений было дано по этой проблеме с тех пор, как я первоначально спросил. Обязательно прочитайте все ответы, чтобы выяснить, что подходит вам лучше всего.
ОБНОВЛЕНИЕ (30 апреля 2015 г.):
С iOS 7.0 теперь я могу просто сделать следующее, что удовлетворит потребности моего первоначального вопроса. Но если у вас есть более сложные случаи, проверьте все ответы.
UIImage *iconImage = [[UIImage imageNamed:@"myImageName"] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
UIImageView *icon = [[UIImageView alloc] initWithImage:iconImage];
icon.tintColor = [UIColor redColor];
UIImageView (или любое другое представление в этом отношении) имеет цвет фона, который является RGBA. Альфа в цвете может делать то, что вам нужно, не изобретая ничего нового.
После поисков лучшее решение, к которому я пришел, - это использовать комбинацию режима наложения и обтравочной маски для достижения раскрашивания / тонирования прозрачного PNG:
CGContextSetBlendMode (context, kCGBlendModeMultiply);
CGContextDrawImage(context, rect, myIconImage.CGImage);
CGContextClipToMask(context, rect, myIconImage.CGImage);
CGContextSetFillColorWithColor(context, tintColor);
CGContextFillRect(context, rect);