Динамическое изменение цвета кнопки раскрытия деталей в коде

Я знаю, что подобные вопросы задавались ранее, но в большинстве ответов говорится о создании нового изображения кнопки раскрытия деталей с требуемым цветом (например, Как изменить цвет кнопки раскрытия деталей для ячейки таблицы).

Я хочу иметь возможность изменить его на любой цвет, который я выберу, динамически, во время выполнения, поэтому использование предварительно настроенного изображения невозможно.

Из прочтения, я думаю, что может быть несколько способов сделать это, но я не уверен, что является лучшим, или как именно это сделать:

  1. Нарисуйте нужный цветовой круг в коде и наложите изображение тени вокруг круга и стрелки вправо (с чистым альфа-каналом для отдыха, поэтому нарисованный цветной круг все еще виден)

  2. Добавьте изображение тени вокруг круга в UIImageView и, используя в качестве маски, залейте заливку внутри этого теневого круга, а затем наложите стрелку.

  3. Добавьте изображение в градациях серого, замаскируйте его сами и наложите нужный цвет (например, 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;
}

Вот изображение раскрытия детализации в оттенках серого без сетчатки:

Вот версия сетчатки:

Вот маска без сетчатки (между кавычками - в основном белая): ""

И маска для сетчатки (между кавычками:"

Также рассмотрите возможность использования значка шрифта в метке вместо изображения. Что-то вроде глифов. Затем вы можете установить цвет текста на любой, что вы хотите. У вас также есть хорошие варианты для масштабирования. Считается, что в некоторых случаях у вас нет такого точного контроля, но он должен хорошо работать в вашем случае.

Другие вопросы по тегам