2013-01-24 45 views
6

Tôi đang làm việc trên một ứng dụng - hay đúng hơn trên một số "khung công tác" có thể tái sử dụng mà tôi rất vui khi chia sẻ khi nó hoạt động. Trong ứng dụng này, người dùng có thể chọn từ danh sách chủ đề màu sắc. Do đó ứng dụng phải có khả năng tô màu các phần tử giao diện người dùng của nó theo một cách khá năng động.Làm cách nào để tô màu hình nền của UIButton theo cách lập trình và động?

Đối với các nút, tất cả các tông màu không hoạt động. Phải cung cấp các ảnh nền đúng màu ở đây. Nhưng việc chuẩn bị một bộ hình nền cho mỗi bức ảnh chỉ là thứ hai tốt nhất. Nó không đủ năng động và linh hoạt.

Cuối cùng, một giải pháp có thể đi xuống để cung cấp một hình ảnh đơn sắc (xám) được tô màu cho trạng thái được chọn và bình thường và sắc thái hình ảnh đó bằng lập trình sử dụng CoreGraphics hoặc OpenGL. Nhưng thẳng thắn mà nói, tôi không biết bắt đầu từ đâu. Làm thế nào nên gradient trông như thế nào và làm thế nào tôi sau đó lập trình màu mà trong bất kỳ màu nào?

Khá nhiều áp dụng cho UISegmentedControls, chỉ phức tạp hơn một chút. :) Bất kỳ giải pháp chung bao gồm UISegementedControls quá là highliy đánh giá cao.

+0

Hãy xem [GMButton] (https://github.com/progrmr/SDK_Utilities/blob/master/GM_Subclasses/GMButton.h) . Nó cho phép bạn thiết lập màu sắc cho tất cả các trạng thái nút và cung cấp độ bóng bevel và độ bóng là tốt. – progrmr

+0

Có vẻ tốt những gì bạn đã làm ở đó. Có vẻ như tôi chỉ cần áp dụng điều này cho ARC và sau đó nó sẽ làm mọi thứ tôi muốn. Cảm ơn. –

Trả lời

12

tôi đã thực hiện một loại UIImage sau một bài mà tôi không thể thấy rằng mất hình ảnh và sắc thái màu nó như sau:

- (UIImage *)tintedImageWithColor:(UIColor *)tintColor { 
    UIGraphicsBeginImageContextWithOptions(self.size, NO, [[UIScreen mainScreen] scale]); 
    CGContextRef context = UIGraphicsGetCurrentContext(); 


    CGContextTranslateCTM(context, 0, self.size.height); 
    CGContextScaleCTM(context, 1.0, -1.0); 

    CGRect rect = CGRectMake(0, 0, self.size.width, self.size.height); 

    // draw alpha-mask 
    CGContextSetBlendMode(context, kCGBlendModeNormal); 
    CGContextDrawImage(context, rect, self.CGImage); 

    // draw tint color, preserving alpha values of original image 
    CGContextSetBlendMode(context, kCGBlendModeSourceIn); 
    [tintColor setFill]; 
    CGContextFillRect(context, rect); 

    UIImage *coloredImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    return coloredImage; 
} 

Điều này sẽ lấy hình ảnh và điền vào tất cả các khu vực với một giá trị alpha với màu sắc nhất định.

+0

Làm việc như một chram! –

0

Tôi đang giới thiệu bạn đến một câu hỏi SO dường như là những gì bạn đang tìm kiếm và nó có câu trả lời.

How to tint a transparent PNG image in iPhone?

Chúc may mắn!

Chỉ một chi tiết nhỏ trên tiêu đề câu hỏi của bạn ... bạn có nghĩa là "Cách" chứ không phải "Nóng" phải không?

+1

Đó không phải là câu trả lời tôi đã hy vọng nhưng điều đó dường như có thể làm được. Cảm ơn. Tôi sẽ thử, có thể là cuối tuần qua. –

1

Đây là câu trả lời một phần cho câu hỏi của bạn. Đây là một phương pháp helper tôi đã viết rằng sắc thái màu một hình ảnh thang xám:

// baseImage is the grey scale image. color is the desired tint color 
+ (UIImage *)tintImage:(UIImage *)baseImage withColor:(UIColor *)color { 
    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); 
    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 the original image was stretchable, make the new image stretchable 
    if (baseImage.leftCapWidth || baseImage.topCapHeight) { 
     newImage = [newImage stretchableImageWithLeftCapWidth:baseImage.leftCapWidth topCapHeight:baseImage.topCapHeight]; 
    } 

    return newImage; 
} 
+0

Cảm ơn bạn cho đến nay. Tôi sẽ thử nó vào cuối tuần hoặc đầu tuần sau. Nó trông nhỏ nhặt tương tự như cốt lõi của những gì @OnlyYou đã liên kết. Mặc dù tôi không khá quen thuộc với CG Graphics jet nhưng nó khá tự giải thích. Chỉ một câu hỏi. CGContextScalTCM và ContextTranslateTCM này là cho phép biến đổi tọa độ vì UIKit và CGGraphics có nguồn gốc khác nhau và định hướng khác nhau trên trục y? –

41

Trong iOS7 bạn có thể sử dụng phương pháp imagedWithRenderingMode: kết hợp với các phương pháp setTintColor:

Nhưng, hãy chắc chắn để sử dụng UIImageRenderingModeAlwaysTemplate vì nó thay thế tất cả các màu không công khai trên một UIImage với màu sắc thái. Mặc định là UIImageRenderingModeAutomatic.

UIImageRenderingModeAlwaysTemplate

Always draw the image as a template image, ignoring its color information. 

Ví dụ:

[myButton setTintColor:[UIColor colorWithRed:0 green:0.8196f blue:0.0039f alpha:1]]; 

    UIImage * image = [myButton.currentBackgroundImage imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; 

    [myButton setBackgroundImage:image forState:UIControlStateNormal]; 
+1

Hãy cẩn thận - khi có UIImage __weak không hiển thị hình ảnh trên nút trong chế độ phát hành ios 9, hãy xây dựng –

+0

Làm việc cho SetImage không phải cho SetBackgroudIamge –

4

Tôi tạo ra một thể loại UIButton sử dụng mã horsejockey của: https://github.com/filipstefansson/UITintedButton

Đây là phương pháp mới:

0.123.
-(void)setImageTintColor:(UIColor *)color; 
-(void)setBackgroundTintColor:(UIColor *)color forState:(UIControlState)state; 
+(void)tintButtonImages:(NSArray *)buttons withColor:(UIColor *)color; 
+(void)tintButtonBackgrounds:(NSArray *)buttons withColor:(UIColor *)color forState:(UIControlState)state; 
0

tôi modifie một số điều từ "horsejockey":

+(UIImage *)getTintedImage:(UIImage*)image withColor:(UIColor *)tintColor 
{ 
    UIGraphicsBeginImageContextWithOptions(image.size, NO, [[UIScreen mainScreen] scale]); 
    CGContextRef context = UIGraphicsGetCurrentContext(); 


    CGContextTranslateCTM(context, 0, image.size.height); 
    CGContextScaleCTM(context, 1.0, -1.0); 

    CGRect rect = CGRectMake(0, 0, image.size.width, image.size.height); 

    // draw alpha-mask 
    CGContextSetBlendMode(context, kCGBlendModeNormal); 
    CGContextDrawImage(context, rect, image.CGImage); 

    // draw tint color, preserving alpha values of original image 
    CGContextSetBlendMode(context, kCGBlendModeSourceIn); 
    [tintColor setFill]; 
    CGContextFillRect(context, rect); 

    UIImage *coloredImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    return coloredImage; 
}
Các vấn đề liên quan