如何使用返回 UIColor 的因变量在定义颜色之间淡入淡出

How to fade between define colors with a dependent variable returning UIColor

我想以下面代码所示的格式创建一个函数,以在定义的颜色之间淡入淡出。此函数的目的是根据数据的创建时间更改 table 视图单元格的颜色; NSDate。这个函数应该只考虑一天中的时间; 2015-07-07T12:00:00 将具有与 2015-07-06T12:00:00 相同的颜色。

@implementation NSDate (COLOR_)

- (UIColor *)dayNightColorByTimeOfDay {

}

@end

我想要"fade"的颜色是这些:

一个例子是传递给函数的日期,dateValue = 3pm,return 颜色介于两种颜色 12p 和 6p 之间。我不想让它动起来。

table 中的每个单元格代表此数组的一个实例:

array {
  ...
  NSString title,
  NSDate date
  ...
};

array.date中的数据总是设置为[NSDate日期]。正如您现在所知道的,NSDate 的数据类型 self 是被告变量。

答案包含一些想法。首先是颜色插值。 RGB 表示可以通过对组件进行插值来相当简单地进行插值,如下所示:

// take two bounding colors and answer one that is pct distance between them
- (UIColor *)colorBetween:(UIColor *)colorA and:(UIColor *)colorB distance:(CGFloat)pct {
    CGFloat aR, aG, aB, aA;
    [colorA getRed:&aR green:&aG blue:&aB alpha:&aA];

    CGFloat bR, bG, bB, bA;
    [colorB getRed:&bR green:&bG blue:&bB alpha:&bA];

    CGFloat rR = (1.0-pct)*aR + pct*bR;
    CGFloat rG = (1.0-pct)*aG + pct*bG;
    CGFloat rB = (1.0-pct)*aB + pct*bB;
    CGFloat rA = (1.0-pct)*aA + pct*bA;

    return [UIColor colorWithRed:rR green:rG blue:rB alpha:rA];
}

我们还需要对时间进行插值,这可以通过将时间表示为午夜过后的分钟数来大致完成...

- (NSInteger)minutesSinceMidnightOfDate:(NSDate *)date {

    NSDateComponents *components = [[NSCalendar currentCalendar] components:NSIntegerMax fromDate:date];
    [components setHour:0];
    [components setMinute:0];
    [components setSecond:0];

    NSDate *midnight = [[NSCalendar currentCalendar] dateFromComponents:components];

    NSDateComponents *diff = [[NSCalendar currentCalendar] components:NSCalendarUnitMinute fromDate:midnight toDate:date options:0];

    return [diff minute];
}

我们需要表示插值的参数,尽可能直接根据问题中给出的参数在此处完成...

// macro to convert hex value to UIColor
#define UIColorFromRGB(rgbValue) \
    [UIColor colorWithRed:((float)((rgbValue & 0xFF0000) >> 16))/255.0 \
                    green:((float)((rgbValue & 0x00FF00) >>  8))/255.0 \
                     blue:((float)((rgbValue & 0x0000FF) >>  0))/255.0 \
                    alpha:1.0]

现在,要完成这项工作,找到给定时间之前和之后的时间(以午夜过后的分钟数为单位),获取与这些时间对应的颜色,以与之前和之间的时间距离相匹配的比例插入颜色次后

- (UIColor *)colorForDate:(NSDate *)date {
    // look up the bounds of interpolation here
    NSArray *wheel = @[ @[ @0,    UIColorFromRGB(0x0525FF) ],
                        @[ @360,  UIColorFromRGB(0xFFF199) ],
                        @[ @720,  UIColorFromRGB(0xFFD005) ],
                        @[ @1080, UIColorFromRGB(0x059CFF) ],
                        @[ @1440, UIColorFromRGB(0x0525FF) ]];

    NSInteger m = [self minutesSinceMidnightOfDate:date];

    // find the index in wheel where the minute bound exceeds our date's minutes (m)
    NSInteger wheelIndex = 0;
    for (NSArray *pair in wheel) {
        NSInteger timePosition = [pair[0] intValue];
        if (m < timePosition) {
            break;
        }
        wheelIndex++;
    }

    // wheelIndex will always be in 1..4, get the pair of bounds at wheelIndex
    // and the preceding pair (-1).
    NSArray *priorPair = wheel[wheelIndex-1];
    NSArray *pair = wheel[wheelIndex];

    CGFloat priorMinutes = [priorPair[0] intValue];
    CGFloat minutes = [pair[0] intValue];

    // this is how far we are between the bounds pairs
    CGFloat minutesPct = ((float)m - priorMinutes) / (minutes - priorMinutes);

    // and the colors for the bounds pair
    UIColor *priorColor = priorPair[1];
    UIColor *color = pair[1];

    // call the color interpolation
    return [self colorBetween:priorColor and:color distance:minutesPct];
}