Вручную выцветание от одного UIColor к другому
Я пытаюсь исчезнуть один UIColor
другому в drawRect
, Я создал эту функцию для вычисления цвета с определенным процентом:
- (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];
}
То, что это делает, берет каждое значение R/G/B/A и увеличивает его в зависимости от процента.
Это отчасти работает, но не исчезает [UIColor purpleColor]
в [UIColor redColor]
правильно. На уровне 0,1 процента он проявляется в виде зеленого цвета, а не фиолетового, поэтому кажется, что он постепенно исчезает с зеленого на красный вместо фиолетового на красный.
Кто-нибудь знает, что я делаю не так? Это неправильный подход к вычислению этого? Есть ли более точный способ сделать это?
2 ответа
Решение
Вы получили свой зеленый и синий поменялись местами на последних нескольких строках.
Обновленная версия для Swift
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)
}
}