2013-04-02 36 views
7

Tôi đang cố gắng làm mờ một số UIColor thành một số khác trong một số drawRect. Tôi đã tạo chức năng này để tính toán màu theo một tỷ lệ nhất định:Màu theo cách thủ công mờ dần từ một màu UIC này sang màu khác

- (UIColor *)colorFromColor:(UIColor *)fromColor toColor:(UIColor *)toColor percent:(float)percent 
{ 
    float dec = percent/100.f; 
    CGFloat fRed, fBlue, fGreen, fAlpha; 
    CGFloat tRed, tBlue, tGreen, tAlpha; 
    CGFloat red, green, blue, alpha; 

    if(CGColorGetNumberOfComponents(fromColor.CGColor) == 2) { 
     [fromColor getWhite:&fRed alpha:&fAlpha]; 
     fGreen = fRed; 
     fBlue = fRed; 
    } 
    else { 
     [fromColor getRed:&fRed green:&fGreen blue:&fBlue alpha:&fAlpha]; 
    } 
    if(CGColorGetNumberOfComponents(toColor.CGColor) == 2) { 
     [toColor getWhite:&tRed alpha:&tAlpha]; 
     tGreen = tRed; 
     tBlue = tRed; 
    } 
    else { 
     [toColor getRed:&tRed green:&tGreen blue:&tBlue alpha:&tAlpha]; 
    } 

    red = (dec * (tRed - fRed)) + fRed; 
    blue = (dec * (tGreen - fGreen)) + fGreen; 
    green = (dec * (tBlue - fBlue)) + fBlue; 
    alpha = (dec * (tAlpha - fAlpha)) + fAlpha; 

    return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; 
} 

Giá trị này cần mỗi giá trị R/G/B/A và tăng tùy theo tỷ lệ phần trăm.

Loại tác phẩm này, nhưng không phai nhạt [UIColor purpleColor] đến [UIColor redColor] chính xác. Tại 0,1 phần trăm nó xuất hiện như một màu xanh lá cây chứ không phải là màu tím, do đó, nó xuất hiện mờ dần từ màu xanh sang màu đỏ thay vì màu tím sang màu đỏ.

Bất kỳ ai biết tôi đang làm gì sai? Đây có phải là cách tiếp cận sai để tính toán điều này? Có cách nào chính xác hơn để thực hiện việc này không?

Trả lời

4

Bạn đã đổi màu xanh lục và xanh dương của mình trên một vài dòng cuối cùng.

+0

Ôi! Vì vậy, nhiều màu đỏ, xanh lá cây, và xanh ... Tôi nghĩ rằng tôi đã có tất cả thẳng! Cảm ơn! – Luke

+0

Không sao cả. Đôi khi bạn chỉ cần một cặp mắt bổ sung. –

1

phiên bản cập nhật cho nhanh chóng

import UIKit 

extension UIColor { 
    // MARK: - UIColor+Percentage 


    class func colorForProgress(progress:CGFloat) -> UIColor { 

     var normalizedProgress = progress < 0 ? 0 : progress 
     normalizedProgress = normalizedProgress > 1 ? 1 : normalizedProgress 

     let R:CGFloat = 155.0 * normalizedProgress 
     let G:CGFloat = 155.0 * (1 - normalizedProgress) 
     let B:CGFloat = 0.0 

     return UIColor(red: R/255.0, green: G/255.0, blue: B/255.0, alpha: 1) 
    } 

    class func transitionColor(fromColor:UIColor, toColor:UIColor, progress:CGFloat) -> UIColor {  

     var percentage = progress < 0 ? 0 : progress 
     percentage = percentage > 1 ? 1 : percentage 

     var fRed:CGFloat = 0 
     var fBlue:CGFloat = 0 
     var fGreen:CGFloat = 0 
     var fAlpha:CGFloat = 0 

     var tRed:CGFloat = 0 
     var tBlue:CGFloat = 0 
     var tGreen:CGFloat = 0 
     var tAlpha:CGFloat = 0 

     fromColor.getRed(&fRed, green: &fGreen, blue: &fBlue, alpha: &fAlpha) 
     toColor.getRed(&tRed, green: &tGreen, blue: &tBlue, alpha: &tAlpha) 

     let red:CGFloat = (percentage * (tRed - fRed)) + fRed; 
     let green:CGFloat = (percentage * (tGreen - fGreen)) + fGreen; 
     let blue:CGFloat = (percentage * (tBlue - fBlue)) + fBlue; 
     let alpha:CGFloat = (percentage * (tAlpha - fAlpha)) + fAlpha; 

     return UIColor(red: red, green: green, blue: blue, alpha: alpha) 
    } 
} 
Các vấn đề liên quan