2013-05-22 7 views
1

비슷한 질문을 이미 알고 있지만 대부분의 답변에서 필요한 세부 정보 공개 버튼 이미지 (예 : How to change color of detail disclosure button for table cell)를 만듭니다.세부 정보 공개 버튼의 코드를 코드에서 동적으로 변경

런타임에 동적으로 선택하는 색상으로 변경할 수 있기를 원하므로 미리 구성된 이미지를 사용하면 실행 가능하지 않습니다. 주변 읽기에서

, 나는이 작업을 수행 할 수있는 몇 가지 방법이있을 수있다 생각하지만, 나는 최고입니다, 또는 정확하게 작업을 수행하는 방법을 확실하지 않다 :

  1. 가 필요한 색 원을 그립니다 코드 안의 그림자 이미지와 원과 화살표 오른쪽 바깥쪽에 둥글게됩니다. (나머지는 맑은 알파 채널을 사용하므로 그려진 색상 원은 여전히 ​​볼 수 있습니다.)

  2. UIImageView에서 원의 바깥쪽에 그림자 이미지를 추가하고 가면으로,이 그림자 동그라미 안에 홍수가 채워진 다음, 화살을 덮어 라.

  3. 그레이 스케일 이미지를 추가하고 그레이 스케일 이미지를 추가 한 다음 필요한 색상 (예 : http://coffeeshopped.com/2010/09/iphone-how-to-dynamically-color-a-uiimage)을 오버레이 한 다음 화살표 이미지로 오버레이합니다.

가장 좋은 방법은 무엇입니까?

+0

나는 내 자신의 응용 프로그램에서 옵션 3을 사용합니다. 꽤 잘 작동합니다. – rmaddy

+0

@rmaddy - 화살표가없는 세부 공개 버튼의 그레이 스케일 이미지 (가능한 경우 망막 이외의 버전과 망막 버전 모두)를 올릴 수 있습니까? – DarkMatter

+0

OK, 제 답변을 참조하십시오. – rmaddy

답변

2

다음 도우미 방법을 사용하여 회색 음영 이미지에 색조를 지정합니다. 그레이 스케일 이미지, 색조 색 및 그레이 스케일 이미지의 일부에서만 색조가 발생하는지 확인하는 데 사용되는 옵션 마스크 이미지를 사용합니다. 이 메소드는 또한 새 이미지가 원본 이미지와 동일한 크기 조정 인서트 (있는 경우)를 갖도록합니다. 그것은 대부분의 - 여기 enter image description here

는 따옴표 사이의 비 망막 마스크 (이다 : 여기 enter image description here

망막 버전입니다 : 여기

+ (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; 
} 

는 비 망막 그레이 스케일 상세하게 공개 이미지 흰색) : " enter image description here"

그리고 망막 마스크 (따옴표 사이 : "enter image description here"

+0

많은 감사합니다 @rmaddy. 당신은 전설입니다! 내 질문에 특별히 묻지는 않았지만 화살표 이미지를 오버레이 할 계획 이었기 때문에 똑같은 동적 색상의 단추를 틱, 십자가 및 세 번째 단추와 함께 만들 수있었습니다. 어떤 화살표/틱/십자가 (즉, 흰색 테두리가있는 컬러 원형 이미지)가 없습니다. 진드기가있는 유사한 이미지/마스크가 있고 십자가와 일반 마스크가 있다고 가정하지 마십시오. 난 단지 코드를 테스트 할 것이고 모든 것이 예상대로 작동한다면 이것을 대답으로 표시 할 것입니다. – DarkMatter

+0

당신의 솔루션이 이미지의 컬러링을 위해 작동하는 동안 몇 가지 외관상의 문제가 있습니다. 1) 이미지의 위쪽 절반에 하이라이트 호를 잃어서 컬러가 단색으로 나타납니다. 2) 색조가 채워지면 새 색상이 왼쪽, 오른쪽 및 아래쪽의 안쪽 테두리와 만나는 부분이 원래 회색 음영 이미지처럼 잘 보이지 않습니다. – DarkMatter

+0

문제 (1)의 경우 강조 표시는 일부 색상 만 사용하여 손실되지 않습니다. (2)의 경우, 그것은 단지 내 눈일 수도 있지만, 모든 색상이 그다지 좋지는 않습니다. 이것을 완벽하지는 않지만 대답으로 표시하면 지금은 나를 위해 충분합니다. 조금 더 나은 해결책은 모든 색상으로 강조 표시를 유지하는 것입니다. 원에 단색을 그리고 주변 테두리, 강조 표시 및 기호에 오버레이 이미지를 사용하는 것입니다 (예 : 쉐브론/화살표, 틱, 십자가 등).) – DarkMatter

0

이미지 대신 레이블에 아이콘 글꼴을 사용하는 것도 고려하십시오. glyphicons과 같은 것입니다. 그런 다음 텍스트 색상을 원하는대로 설정할 수 있습니다. 또한 확장을위한 좋은 옵션이 있습니다. 비용은 어떤 경우에는 매우 정밀한 제어를하지 못하지만 귀하의 경우에 잘 작동해야합니다.