Динамическое изменение цвета кнопки раскрытия деталей в коде
Я знаю, что подобные вопросы задавались ранее, но в большинстве ответов говорится о создании нового изображения кнопки раскрытия деталей с требуемым цветом (например, Как изменить цвет кнопки раскрытия деталей для ячейки таблицы).
Я хочу иметь возможность изменить его на любой цвет, который я выберу, динамически, во время выполнения, поэтому использование предварительно настроенного изображения невозможно.
Из прочтения, я думаю, что может быть несколько способов сделать это, но я не уверен, что является лучшим, или как именно это сделать:
Нарисуйте нужный цветовой круг в коде и наложите изображение тени вокруг круга и стрелки вправо (с чистым альфа-каналом для отдыха, поэтому нарисованный цветной круг все еще виден)
Добавьте изображение тени вокруг круга в UIImageView и, используя в качестве маски, залейте заливку внутри этого теневого круга, а затем наложите стрелку.
Добавьте изображение в градациях серого, замаскируйте его сами и наложите нужный цвет (например, http://coffeeshopped.com/2010/09/iphone-how-to-dynamically-color-a-uiimage), затем наложите его на изображение стрелки.
Каков наилучший способ, и есть ли у кого-нибудь код, показывающий, как именно это сделать?
2 ответа
Я использую следующий вспомогательный метод, чтобы подкрасить изображение в градациях серого. Он принимает изображение в градациях серого, цвет оттенка и изображение маски опции, используемое для гарантии того, что оттенок происходит только в части изображения в градациях серого. Этот метод также гарантирует, что новое изображение имеет те же (если они есть) вставки с изменяемым размером, что и исходное изображение.
+ (UIImage *)tintImage:(UIImage *)baseImage withColor:(UIColor *)color mask:(UIImage *)maskImage {
UIGraphicsBeginImageContextWithOptions(baseImage.size, NO, baseImage.scale);
CGContextRef ctx = UIGraphicsGetCurrentContext();
CGRect area = CGRectMake(0, 0, baseImage.size.width, baseImage.size.height);
CGContextScaleCTM(ctx, 1, -1);
CGContextTranslateCTM(ctx, 0, -area.size.height);
CGContextSaveGState(ctx);
if (maskImage) {
CGContextClipToMask(ctx, area, maskImage.CGImage);
} else {
CGContextClipToMask(ctx, area, baseImage.CGImage);
}
[color set];
CGContextFillRect(ctx, area);
CGContextRestoreGState(ctx);
CGContextSetBlendMode(ctx, kCGBlendModeOverlay);
CGContextDrawImage(ctx, area, baseImage.CGImage);
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
if (!UIEdgeInsetsEqualToEdgeInsets(baseImage.capInsets, UIEdgeInsetsZero)) {
newImage = [newImage resizableImageWithCapInsets:baseImage.capInsets];
}
return newImage;
}
Вот изображение раскрытия детализации в оттенках серого без сетчатки:
Вот версия сетчатки:
Вот маска без сетчатки (между кавычками - в основном белая): ""
И маска для сетчатки (между кавычками:"
Также рассмотрите возможность использования значка шрифта в метке вместо изображения. Что-то вроде глифов. Затем вы можете установить цвет текста на любой, что вы хотите. У вас также есть хорошие варианты для масштабирования. Считается, что в некоторых случаях у вас нет такого точного контроля, но он должен хорошо работать в вашем случае.