2015-07-07 1 views
1

Я хочу создать функцию в формате, показанном в приведенном ниже коде, для постепенного исчезновения между определенными цветами. Целью этой функции является изменение цвета ячейки представления таблицы в зависимости от того, когда были созданы данные; NSDate. Эта функция должна учитывать только время суток; 2015-07-07T12: 00: 00 будет иметь тот же цвет, что и 2015-07-06T12: 00: 00.Как затухать между цветами определения с зависимой переменной, возвращающей UIColor

@implementation NSDate (COLOR_) 

- (UIColor *)dayNightColorByTimeOfDay { 

} 

@end 

Цвета я хочу "замирания" между таковы:

  • 12а # 0525FF
  • 6а # FFF199
  • 12p # FFD005
  • 6p # 059CFF
  • и затем вернуться к 12a.

Примером может быть дата, переданная в функцию dateValue = 3pm, возвратит цвет между двумя цветами, 12p и 6p. Я не хочу, чтобы он оживлял.

Каждая ячейка в таблице представляет экземпляр этого массива:

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

Данные в array.date всегда установлен в [дата] NSDate. Как вы уже могли сказать, я, тип данных NSDate, является переменной ответчика.

ответ

2

Ответ содержит несколько идей. Сначала это интерполяция цветов. представление 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]; 
} 
+0

Это замечательный! Смогу ли я изменить объявление, ** NSArray * wheel = .. ** с любым другим шестнадцатеричным или любым числом пар? Например, если бы я хотел добавить больше цветов определения дня. – ErickES7

+0

Несомненно. Пока значение первого значения равно 0, а последнее - 1440. – danh

Смежные вопросы