색상 색조 UIButton 이미지


294

흰색이나 검은 색을 UIImage넣을 UISegmentedControl때 세그먼트 컨트롤의 색조와 일치하도록 자동으로 컬러 마스크됩니다. 나는 이것이 정말로 시원하다고 생각했고, 내가 다른 곳에서도 이것을 할 수 있는지 궁금했다. 예를 들어, 모양이 균일하지만 색상이 다양한 버튼이 많이 있습니다. 각 버튼에 PNG를 만드는 대신이 색상 마스킹을 사용하여 모든 이미지에 동일한 이미지를 사용할 수 있지만 색조 또는 실제 색상을 변경하기 위해 무언가를 설정할 수 있습니까?


사용하려는 이미지와 원하는 결과를 게시 할 수 있습니까?
Pratyusha Terli

이것은 인터페이스 빌더와 동일합니다. stackoverflow.com/a/25179217/2051381
Chuy47

답변:


619

iOS 7부터 UIImage렌더링 모드를 지정 하는 새로운 방법이 있습니다. 렌더링 모드 UIImageRenderingModeAlwaysTemplate를 사용하면 버튼의 색조 색상으로 이미지 색상을 제어 할 수 있습니다.

목표 -C

UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
UIImage *image = [[UIImage imageNamed:@"image_name"] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
[button setImage:image forState:UIControlStateNormal]; 
button.tintColor = [UIColor redColor];

빠른

let button = UIButton(type: .custom)
let image = UIImage(named: "image_name")?.withRenderingMode(.alwaysTemplate)
button.setImage(image, for: .normal)
button.tintColor = UIColor.red

14
button.imageView.tintColor를 사용하는 것이 더 좋다고 생각합니다
M.Othman

3
@ M.Othman은 button.imageview.tintColor가 아닌 button.tintColor를 사용할 때만 작동합니다.
pnizzle

32
@hashier 당 xcassets에서 이미지에 이미지 렌더링 모드를 설정하는 것을 잊지 마십시오
Dean

23
UIButtonTypeSystem 유형의 UIButton을 만들면 사용자가 설정 한 tintColor가 자동으로 적용됩니다.
carloshwa

4
당신 tintColor이 너무 어둡다면, adjustsImageWhenHighlightedNO가 아닌지 확인하십시오 . (또는 IB에서 : "강조 조정 된 이미지 조정"이 선택되어 있지 않습니다.)
Jason Moore

225

Ric이 그의 게시물 에서 이미 언급했듯이 코드에서 렌더링 모드를 설정할 수 있으며 이미지 카탈로그에서 직접이를 수행 할 수도 있습니다 (아래 첨부 된 이미지 참조). 그냥 설정 Render AsTemplate Image

여기에 이미지 설명을 입력하십시오

주의 사항 iOS 7 및이 방법에 문제가 있습니다. 따라서 iOS 7을 사용하는 경우 여기에 설명 된대로 확실하게 코드로 수행 할 수 있습니다 .


1
보조 노트 된 바와 같이, 이미지 파일 (되지 B & W) 블랙 투명해야
악셀 Guilmin

6
@AxelGuilmin은 실제로는 아닙니다. 이미지는 원하는 색상이고 투명 할 수 있습니다. 투명 이외의 색상 은 일반 색상 으로 변환 된 다음 기본적으로 검은 색으로 색조가 지정됩니다.
Alejandro Iván

90

사용자 정의 버튼 은 해당 이미지 색상으로 나타납니다. 스토리 보드에서 또는 UIButtonTypeSystem코드 에서 버튼 유형을 "시스템"으로 설정하면 버튼 의 이미지가 기본 색조 색상으로 렌더링됩니다.

버튼 유형 시스템 렌더링 아이콘 색조

(iOS9, Xcode 7.3에서 테스트)


2
여기서 제안 된 alwaysTemplate 및 tintColor 메소드를 사용하면 피할 수 있습니다. .system 버튼의 장점으로 탭을 터치하면 색상이 변경됩니다.
Chris Prince

44

당신은에 이미지 렌더링 모드를 설정해야합니다 UIImageRenderingModeAlwaysTemplate(가) 가지고하기 위해 tintColor있는 UIImage에 영향을 미칩니다. Swift의 솔루션은 다음과 같습니다.

let image = UIImage(named: "image-name")
let button = UIButton()
button.setImage(image?.imageWithRenderingMode(UIImageRenderingMode.AlwaysTemplate), forState: .Normal)
button.tintColor = UIColor.whiteColor()

빠른 4x

button.setImage(image.withRenderingMode(UIImage.RenderingMode.alwaysTemplate), for: .normal)
button.tintColor = UIColor.blue

28

배경 이미지가있는 사용자 지정 단추가있는 경우 단추의 색조 색상을 설정하고 다음과 같이 이미지를 재정의 할 수 있습니다.

자산에서 색조 색상을 설정하려는 버튼 배경을 선택하십시오.

이미지의 속성 관리자에서 값을 "템플릿 이미지"로 설정합니다.

여기에 이미지 설명을 입력하십시오

이제 설정 button.tintColor = UIColor.red할 때마다 버튼이 빨간색으로 표시됩니다.


여기에 있다면 youryourloaf.com/blog/styling-buttons-using-the-asset-catalog 링크 로 이동하여 템플릿 이미지로 이동하십시오 (설명으로 제공)
cspam

이것은 코드를 줄이고 승인 된 답변과 거의 동일한 기능을 수행하므로 더 나은 솔루션입니다.
DS.

나는 이것이 올바른 것이라고 생각합니다. 코드가 적고 취급하기 쉽습니다.
Umair_UAS

17

Swift에서는 다음과 같이 할 수 있습니다.

var exampleImage = UIImage(named: "ExampleImage.png")?.imageWithRenderingMode(.AlwaysTemplate)

그런 다음 viewDidLoad에서

exampleButtonOutlet.setImage(exampleImage, forState: UIControlState.Normal)

그리고 색상을 수정하려면

exampleButtonOutlet.tintColor = UIColor(red: 1, green: 0, blue: 0, alpha: 1) //your color

Xcode 8 편집 이제 .xcassets에서 이미지의 렌더링 모드를 템플릿 이미지로 렌더링 할 수 있으며 var exampleImage더 이상 이미지를 구체적으로 선언 할 필요가 없습니다.


14

정확히 원하는 것이 확실하지 않지만이 카테고리 메소드는 지정된 색상으로 UIImage를 마스킹하여 단일 이미지를 가지고 원하는 색상을 변경할 수 있습니다.

ImageUtils.h

- (UIImage *) maskWithColor:(UIColor *)color;

ImageUtils.m

-(UIImage *) maskWithColor:(UIColor *)color 
{
    CGImageRef maskImage = self.CGImage;
    CGFloat width = self.size.width;
    CGFloat height = self.size.height;
    CGRect bounds = CGRectMake(0,0,width,height);

    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    CGContextRef bitmapContext = CGBitmapContextCreate(NULL, width, height, 8, 0, colorSpace, kCGImageAlphaPremultipliedLast);
    CGContextClipToMask(bitmapContext, bounds, maskImage);
    CGContextSetFillColorWithColor(bitmapContext, color.CGColor);    
    CGContextFillRect(bitmapContext, bounds);

    CGImageRef cImage = CGBitmapContextCreateImage(bitmapContext);
    UIImage *coloredImage = [UIImage imageWithCGImage:cImage];

    CGContextRelease(bitmapContext);
    CGColorSpaceRelease(colorSpace);
    CGImageRelease(cImage);

    return coloredImage;    
}

ImageUtils 카테고리를 가져 와서 이와 같은 작업을 수행하십시오.

#import "ImageUtils.h"

...

UIImage *icon = [UIImage imageNamed:ICON_IMAGE];

UIImage *redIcon = [icon maskWithColor:UIColor.redColor];
UIImage *blueIcon = [icon maskWithColor:UIColor.blueColor];

3
사용 kCGBitmapAlphaInfoMask & kCGImageAlphaPremultipliedLastCGBitmapContextCreate
루이스 Ascorbe

4
멋지지만 Retina 그래픽을 조정해야합니다 ... Retina 이미지에서이를 실행하면 Retina가 아닌 이미지가 반환됩니다.
jowie

Retina 장치를 지원하기 위해 UIDevice클래스 의 scale 속성을 사용할 수 있습니다 . CGFloat scale = [UIScreen mainScreen].scale; CGFloat width = self.size.width * scale; CGFloat height = self.size.height * scale;scale속성은 iOS 4.0부터 존재합니다.
Philipp Frischmuth

또한 scale값을 UIImage만들 때이 값 을 사용해야합니다 .UIImage *coloredImage = [UIImage imageWithCGImage:cImage scale:scale orientation:self.imageOrientation];
Philipp Frischmuth

8

customType이있는 스위프트 4 :

let button = UIButton(frame: aRectHere)
    let buttonImage = UIImage(named: "imageName")
    button.setImage(buttonImage?.withRenderingMode(.alwaysTemplate), for: .normal)
    button.tintColor = .white

5

Xamarin.iOS (C #)의 경우 :

        UIButton messagesButton = new UIButton(UIButtonType.Custom);
        UIImage icon = UIImage.FromBundle("Images/icon.png");
        messagesButton.SetImage(icon.ImageWithRenderingMode(UIImageRenderingMode.AlwaysTemplate), UIControlState.Normal);
        messagesButton.TintColor = UIColor.White;
        messagesButton.Frame = new RectangleF(0, 0, 25, 25);

5

스위프트 3 :

이 솔루션은 xCode 인터페이스 빌더를 통해 이미 이미지를 설정 한 경우 편안 할 수 있습니다. 기본적으로 이미지를 채색하는 확장명이 하나 있습니다.

extension UIImage {
    public func image(withTintColor color: UIColor) -> UIImage{
        UIGraphicsBeginImageContextWithOptions(self.size, false, self.scale)
        let context: CGContext = UIGraphicsGetCurrentContext()!
        context.translateBy(x: 0, y: self.size.height)
        context.scaleBy(x: 1.0, y: -1.0)
        context.setBlendMode(CGBlendMode.normal)
        let rect: CGRect = CGRect(x: 0, y: 0, width: self.size.width, height: self.size.height)
        context.clip(to: rect, mask: self.cgImage!)
        color.setFill()
        context.fill(rect)
        let newImage: UIImage = UIGraphicsGetImageFromCurrentImageContext()!
        UIGraphicsEndImageContext()
        return newImage
    }
}

그런 다음이 UIButton 확장을 준비 하여 특정 상태의 이미지를 채색 할 수 있습니다 .

extension UIButton {
    func imageWith(color:UIColor, for: UIControlState) {
        if let imageForState = self.image(for: state) {
            self.image(for: .normal)?.withRenderingMode(.alwaysTemplate)
            let colorizedImage = imageForState.image(withTintColor: color)
            self.setImage(colorizedImage, for: state)
        }
    }
}

용법:

myButton.imageWith(.red, for: .normal)

추신 (테이블 셀에서도 잘 작동하며 setNeedDisplay()메서드 를 호출 할 필요가 없으며 UIImage 확장 으로 인해 색상 변경이 즉시 발생합니다 ..


3

이미지를 수동으로 마스킹하려면 망막 화면에서 작동하는 업데이트 된 코드가 있습니다.

- (UIImage *)maskWithColor:(UIColor *)color
{
    CGImageRef maskImage = self.CGImage;
    CGFloat width = self.size.width * self.scale;
    CGFloat height = self.size.height * self.scale;
    CGRect bounds = CGRectMake(0,0,width,height);

    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    CGContextRef bitmapContext = CGBitmapContextCreate(NULL, width, height, 8, 0, colorSpace, kCGBitmapAlphaInfoMask & kCGImageAlphaPremultipliedLast);
    CGContextClipToMask(bitmapContext, bounds, maskImage);
    CGContextSetFillColorWithColor(bitmapContext, color.CGColor);
    CGContextFillRect(bitmapContext, bounds);

    CGImageRef cImage = CGBitmapContextCreateImage(bitmapContext);
    UIImage *coloredImage = [UIImage imageWithCGImage:cImage scale:self.scale orientation:self.imageOrientation];

    CGContextRelease(bitmapContext);
    CGColorSpaceRelease(colorSpace);
    CGImageRelease(cImage);

    return coloredImage;
}

2

당신은 시도해야

프레임 설정 후

NSArray *arr10 =[NSArray arrayWithObjects:btn1,btn2,nil];
for(UIButton *btn10 in arr10)
{
CAGradientLayer *btnGradient2 = [CAGradientLayer layer];
btnGradient2.frame = btn10.bounds;

btnGradient2.colors = [NSArray arrayWithObjects:
                       (id)[[UIColor colorWithRed:151.0/255.0f green:206.0/255.5 blue:99.0/255.0 alpha:1] CGColor],
                       (id)[[UIColor colorWithRed:126.0/255.0f green:192.0/255.5 blue:65.0/255.0 alpha:1]CGColor],
                       nil];
[btn10.layer insertSublayer:btnGradient2 atIndex:0];

}

2

스위프트 3.0

    let image = UIImage(named:"NoConnection")!

 warningButton = UIButton(type: .system)        
    warningButton.setImage(image, for: .normal)
    warningButton.tintColor = UIColor.lightText
    warningButton.frame = CGRect(origin: CGPoint(x:-100,y:0), size: CGSize(width: 59, height: 56))

    self.addSubview(warningButton)

1

단추 이미지 또는 이미지보기 색조 색상 변경

btn.imageView?.image = btn.imageView?.image?.withRenderingMode(.alwaysTemplate)

btn.imageView?.tintColor = #colorLiteral(red: 0, green: 0, blue: 0, alpha: 1)

-1

클릭 후 색조가 지워졌 기 때문에 위의 어느 것도 나를 위해 일하지 않았습니다. 나는 사용해야했다

button.setImageTintColor(Palette.darkGray(), for: UIControlState())
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.