Ios 在代码中动态更改详细信息披露按钮的颜色

Ios 在代码中动态更改详细信息披露按钮的颜色,ios,colors,indicator,detail,disclosure,Ios,Colors,Indicator,Detail,Disclosure,我知道以前也有人问过类似的问题,但大多数答案都是用所需的颜色(例如)创建一个新的详细信息披露按钮图像 我希望能够在运行时动态地将其更改为我选择的任何颜色,因此使用预先配置的映像是不可行的 通过阅读,我认为可能有几种方法可以做到这一点,但我不确定哪种方法是最好的,或者确切地说是如何做到的: 在代码中绘制所需的彩色圆圈,并在圆圈外覆盖一个阴影圆圈图像和向右箭头(其余为清晰的alpha通道,因此绘制的彩色圆圈仍然可见) 在UIImageView中将阴影圆的图像添加到圆的外部,并将其用作遮罩,在该阴影圆

我知道以前也有人问过类似的问题,但大多数答案都是用所需的颜色(例如)创建一个新的详细信息披露按钮图像

我希望能够在运行时动态地将其更改为我选择的任何颜色,因此使用预先配置的映像是不可行的

通过阅读,我认为可能有几种方法可以做到这一点,但我不确定哪种方法是最好的,或者确切地说是如何做到的:

  • 在代码中绘制所需的彩色圆圈,并在圆圈外覆盖一个阴影圆圈图像和向右箭头(其余为清晰的alpha通道,因此绘制的彩色圆圈仍然可见)

  • 在UIImageView中将阴影圆的图像添加到圆的外部,并将其用作遮罩,在该阴影圆内进行整体填充,然后覆盖箭头

  • 添加灰度图像,用自身遮罩,并覆盖所需颜色(例如),然后用箭头图像覆盖


  • 最好的方法是什么?有没有人有任何代码可以准确地显示如何做到这一点?

    也可以考虑在标签中使用图标字体,而不是图像。差不多。然后您可以将文本颜色设置为您想要的任何颜色。您也有很好的缩放选项。成本是,在某些情况下,您没有如此精确的控制,但它应该适合您的情况。

    我使用以下辅助方法为灰度图像着色。它采用灰度图像、着色颜色和选项遮罩图像,用于确保着色仅发生在灰度图像的一部分。此方法还确保新图像具有与原始图像相同(如果有)的可调整大小的插入

    + (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;
    }
    
    以下是非视网膜灰度细节披露图像:

    以下是视网膜版本:

    这是非视网膜面罩(引号之间-大部分为白色): “”

    和视网膜面罩(引号之间:

    我在自己的应用程序中使用了选项3。效果很好。@rmaddy-有没有可能在不使用箭头的情况下发布详细信息披露按钮的灰度图像(如果可能,包括非视网膜和视网膜版本)?非常感谢@rmaddy。你是一个传奇人物!我知道我在我的问题中没有特别要求它,但我计划覆盖箭头图像,这样我也可以使用它创建一个类似的动态彩色按钮,带有记号,一个带有十字,第三个没有任何箭头/记号/十字(即,只有带白色边框的彩色圆形图像)。难道你不认为你有类似的图像/遮罩,上面有一个勾号,也有一个十字,还有一个普通的吗?我只是想测试一下你的代码,如果一切正常,我会将此标记为答案。虽然你的解决方案可以为图像着色,但有几个表面问题:1)它会丢失图像上半部分的高光弧,因此颜色显示为纯色。2) 着色后,新颜色在左、右和底部与内边框相交的部分看起来不像原始灰度图像那样漂亮。对于问题(1),所有颜色的高光都不会消失,只有部分颜色。对于(2),它可能只是我的眼睛,但它看起来不太好,所有的颜色。把这个作为答案,尽管它并不完美,但现在对我来说已经足够好了。我认为一个稍微好一点的解决方案是为圆绘制一个纯色,并为周围的边框、高光和符号(即V形/箭头、勾号、十字等)使用重叠图像,这样可以使高光与所有颜色保持一致