ORKSignatureColorKey: ORKRGB()

in iOS/MyStudies/ResearchKit/Common/ORKSkin.m [94:332]


                    ORKSignatureColorKey: ORKRGB(0x000000),
                    ORKBackgroundColorKey: [UIColor colorWithRed:239.0 / 255.0 green:239.0 / 255.0 blue:244.0 / 255.0 alpha:1.0],
                    ORKConsentBackgroundColorKey: ORKRGB(0xffffff),
                    ORKToolBarTintColorKey: ORKRGB(0xffffff),
                    ORKLightTintColorKey: ORKRGB(0xeeeeee),
                    ORKDarkTintColorKey: ORKRGB(0x888888),
                    ORKCaptionTextColorKey: ORKRGB(0xcccccc),
                    ORKBlueHighlightColorKey: [UIColor colorWithRed:0.0 green:122.0 / 255.0 blue:1.0 alpha:1.0],
                    ORKChartDefaultTextColorKey: [UIColor lightGrayColor],
                    ORKGraphAxisColorKey: [UIColor colorWithRed:217.0 / 255.0 green:217.0 / 255.0 blue:217.0 / 255.0 alpha:1.0],
                    ORKGraphAxisTitleColorKey: [UIColor colorWithRed:142.0 / 255.0 green:142.0 / 255.0 blue:147.0 / 255.0 alpha:1.0],
                    ORKGraphReferenceLineColorKey: [UIColor colorWithRed:225.0 / 255.0 green:225.0 / 255.0 blue:229.0 / 255.0 alpha:1.0],
                    ORKGraphScrubberLineColorKey: [UIColor grayColor],
                    ORKGraphScrubberThumbColorKey: [UIColor colorWithWhite:1.0 alpha:1.0],
                    ORKAuxiliaryImageTintColorKey: [UIColor colorWithRed:228.0 / 255.0 green:233.0 / 255.0 blue:235.0 / 255.0 alpha:1.0],
                    ORKNavigationContainerColorKey: [UIColor colorWithRed:249.0 / 255.0 green:249.0 / 255.0 blue:251.0 / 255.0 alpha:0.0],
                    ORKNavigationContainerShadowColorKey: [UIColor blackColor],
                    ORKProgressLabelColorKey: [UIColor colorWithRed:142.0/255.0 green:142.0/255.0 blue:142.0/255.0 alpha:1.0],
                    ORKiPadBackgroundViewColorKey: [UIColor colorWithRed:249.0 / 255.0 green:249.0 / 255.0 blue:251.0 / 255.0 alpha:1.0],
                    } mutableCopy];
    });
    return colors;
}

UIColor *ORKColor(NSString *colorKey) {
    return colors()[colorKey];
}

void ORKColorSetColorForKey(NSString *key, UIColor *color) {
    NSMutableDictionary *d = colors();
    d[key] = color;
}

const CGSize ORKiPhone4ScreenSize = (CGSize){320, 480};
const CGSize ORKiPhone5ScreenSize = (CGSize){320, 568};
const CGSize ORKiPhone6ScreenSize = (CGSize){375, 667};
const CGSize ORKiPhone6PlusScreenSize = (CGSize){414, 736};
const CGSize ORKiPhoneXScreenSize = (CGSize){375, 812};
const CGSize ORKiPhoneXSMaxScreenSize = (CGSize){414, 896};
const CGSize ORKiPadScreenSize = (CGSize){768, 1024};
const CGSize ORKiPad10_5ScreenSize = (CGSize){834, 1112};
const CGSize ORKiPad12_9ScreenSize = (CGSize){1024, 1366};

static ORKScreenType ORKGetVerticalScreenTypeForBounds(CGRect bounds) {
    ORKScreenType screenType = ORKScreenTypeiPhone6;
    CGFloat maximumDimension = MAX(bounds.size.width, bounds.size.height);
    if (maximumDimension < ORKiPhone4ScreenSize.height + 1) {
        screenType = ORKScreenTypeiPhone4;
    } else if (maximumDimension < ORKiPhone5ScreenSize.height + 1) {
        screenType = ORKScreenTypeiPhone5;
    } else if (maximumDimension < ORKiPhone6ScreenSize.height + 1) {
        screenType = ORKScreenTypeiPhone6;
    } else if (maximumDimension < ORKiPhone6PlusScreenSize.height + 1) {
        screenType = ORKScreenTypeiPhone6Plus;
    } else if (maximumDimension < ORKiPhoneXScreenSize.height + 1) {
        screenType = ORKScreenTypeiPhoneX;
    } else if (maximumDimension < ORKiPhoneXSMaxScreenSize.height + 1) {
        screenType = ORKScreenTypeiPhoneXSMax;
    } else if (maximumDimension < ORKiPadScreenSize.height + 1) {
        screenType = ORKScreenTypeiPad;
    } else if (maximumDimension < ORKiPad10_5ScreenSize.height + 1) {
        screenType = ORKScreenTypeiPad10_5;
    } else {
        screenType = ORKScreenTypeiPad12_9;
    }
    return screenType;
}

static ORKScreenType ORKGetHorizontalScreenTypeForBounds(CGRect bounds) {
    ORKScreenType screenType = ORKScreenTypeiPhone6;
    CGFloat minimumDimension = MIN(bounds.size.width, bounds.size.height);
    if (minimumDimension < ORKiPhone4ScreenSize.width + 1) {
        screenType = ORKScreenTypeiPhone4;
    } else if (minimumDimension < ORKiPhone5ScreenSize.width + 1) {
        screenType = ORKScreenTypeiPhone5;
    } else if (minimumDimension < ORKiPhone6ScreenSize.width + 1) {
        screenType = ORKScreenTypeiPhone6;
    }  else if (minimumDimension < ORKiPhoneXScreenSize.width + 1) {
        screenType = ORKScreenTypeiPhoneX;
    }  else if (minimumDimension < ORKiPhoneXSMaxScreenSize.width + 1) {
        screenType = ORKScreenTypeiPhoneXSMax;
    } else if (minimumDimension < ORKiPhone6PlusScreenSize.width + 1) {
        screenType = ORKScreenTypeiPhone6Plus;
    } else if (minimumDimension < ORKiPadScreenSize.width + 1) {
        screenType = ORKScreenTypeiPad;
    } else if (minimumDimension < ORKiPad10_5ScreenSize.width + 1) {
        screenType = ORKScreenTypeiPad10_5;
    } else {
        screenType = ORKScreenTypeiPad12_9;
    }
    return screenType;
}

static UIWindow *ORKDefaultWindowIfWindowIsNil(UIWindow *window) {
    if (!window) {
        // Use this method instead of UIApplication's keyWindow or UIApplication's delegate's window
        // because we may need the window before the keyWindow is set (e.g., if a view controller
        // loads programmatically on the app delegate to be assigned as the root view controller)
        window = [UIApplication sharedApplication].windows.firstObject;
    }
    return window;
}

ORKScreenType ORKGetVerticalScreenTypeForWindow(UIWindow *window) {
    window = ORKDefaultWindowIfWindowIsNil(window);
    return ORKGetVerticalScreenTypeForBounds(window.bounds);
}

ORKScreenType ORKGetHorizontalScreenTypeForWindow(UIWindow *window) {
    window = ORKDefaultWindowIfWindowIsNil(window);
    return ORKGetHorizontalScreenTypeForBounds(window.bounds);
}

ORKScreenType ORKGetScreenTypeForScreen(UIScreen *screen) {
    ORKScreenType screenType = ORKScreenTypeiPhone6;
    if (screen == [UIScreen mainScreen]) {
        screenType = ORKGetVerticalScreenTypeForBounds(screen.bounds);
    }
    return screenType;
}

const CGFloat ORKScreenMetricMaxDimension = 10000.0;

static CGFloat ORKGetMetricForScreenType(ORKScreenMetric metric, ORKScreenType screenType) {
    static  const CGFloat metrics[ORKScreenMetric_COUNT][ORKScreenType_COUNT] = {
        //   iPhoneX, iPhone 6+,  iPhone 6,  iPhone 5,  iPhone 4,      iPad     iPad 10.5,   iPad 12.9
        {        128,       128,       128,       100,       100,       218,       218,       218},      // ORKScreenMetricTopToCaptionBaseline
        {         35,        35,        35,        32,        24,        35,        35,        35},      // ORKScreenMetricFontSizeHeadline
        {         38,        38,        38,        32,        28,        38,        38,        38},      // ORKScreenMetricMaxFontSizeHeadline
        {         30,        30,        30,        30,        24,        30,        30,        30},      // ORKScreenMetricFontSizeSurveyHeadline
        {         32,        32,        32,        32,        28,        32,        32,        32},      // ORKScreenMetricMaxFontSizeSurveyHeadline
        {         17,        17,        17,        17,        16,        17,        17,        17},      // ORKScreenMetricFontSizeSubheadline
        {         12,        12,        12,        12,        11,        12,        12,        12},      // ORKScreenMetricFontSizeFootnote
        {         62,        62,        62,        51,        51,        62,        62,        62},      // ORKScreenMetricCaptionBaselineToFitnessTimerTop
        {         62,        62,        62,        43,        43,        62,        62,        62},      // ORKScreenMetricCaptionBaselineToTappingLabelTop
        {         36,        36,        36,        32,        32,        36,        36,        36},      // ORKScreenMetricCaptionBaselineToInstructionBaseline
        {         30,        30,        30,        28,        24,        30,        30,        30},      // ORKScreenMetricInstructionBaselineToLearnMoreBaseline
        {         44,        44,        44,        20,        14,        44,        44,        44},      // ORKScreenMetricLearnMoreBaselineToStepViewTop
        {         40,        40,        40,        30,        14,        40,        40,        40},      // ORKScreenMetricLearnMoreBaselineToStepViewTopWithNoLearnMore
        {         36,        36,        36,        20,        12,        36,        36,        36},      // ORKScreenMetricContinueButtonTopMargin
        {         40,        40,        40,        20,        12,        40,        40,        40},      // ORKScreenMetricContinueButtonTopMarginForIntroStep
        {          0,         0,         0,         0,         0,        80,       170,       170},      // ORKScreenMetricTopToIllustration
        {         44,        44,        44,        40,        40,        44,        44,        44},      // ORKScreenMetricIllustrationToCaptionBaseline
        {        198,       198,       198,       194,       152,       297,       297,       297},      // ORKScreenMetricIllustrationHeight
        {        300,       300,       300,       176,       152,       300,       300,       300},      // ORKScreenMetricInstructionImageHeight
        {         55,        55,        50,        44,        44,        44,        44,        44},      // ORKScreenMetricContinueButtonHeightRegular
        {         32,        44,        32,        32,        32,        44,        44,        44},      // ORKScreenMetricContinueButtonHeightCompact
        {        150,       150,       150,       146,       146,       150,       150,       150},      // ORKScreenMetricContinueButtonWidth
        {        162,       162,       162,       120,       116,       240,       240,       240},      // ORKScreenMetricMinimumStepHeaderHeightForMemoryGame
        {        200,       250,       200,       180,       150,       250,       250,       250},      // ORKScreenMetricMinimumGameViewHeightForMemoryGame
        {        162,       162,       162,       120,       116,       240,       240,       240},      // ORKScreenMetricMinimumStepHeaderHeightForTowerOfHanoiPuzzle
        {         60,        60,        60,        60,        44,        60,        60,        60},      // ORKScreenMetricTableCellDefaultHeight
        {         55,        55,        55,        55,        44,        55,        55,        55},      // ORKScreenMetricTextFieldCellHeight
        {         36,        36,        36,        36,        26,        36,        36,        36},      // ORKScreenMetricChoiceCellFirstBaselineOffsetFromTop,
        {         24,        24,        24,        24,        18,        24,        24,        24},      // ORKScreenMetricChoiceCellLastBaselineToBottom,
        {         24,        24,        24,        24,        24,        24,        24,        24},      // ORKScreenMetricChoiceCellLabelLastBaselineToLabelFirstBaseline,
        {         30,        30,        30,        20,        20,        30,        30,        30},      // ORKScreenMetricLearnMoreButtonSideMargin
        {         10,        10,        10,         0,         0,        10,        10,        10},      // ORKScreenMetricHeadlineSideMargin
        {         44,        44,        44,        44,        44,        44,        44,        44},      // ORKScreenMetricToolbarHeight
        {        350,       322,       274,       217,       217,       446,       446,       446},      // ORKScreenMetricVerticalScaleHeight
        {        208,       208,       208,       208,       198,       256,       256,       256},      // ORKScreenMetricSignatureViewHeight
        {        324,       384,       324,       304,       304,       384,       384,       384},      // ORKScreenMetricPSATKeyboardViewWidth
        {        197,       197,       167,       157,       157,       197,       197,       197},      // ORKScreenMetricPSATKeyboardViewHeight
        {        238,       238,       238,       150,        90,       238,       238,       238},      // ORKScreenMetricLocationQuestionMapHeight
        {         40,        40,        40,        20,        14,        40,        40,        40},      // ORKScreenMetricTopToIconImageViewTop
        {         44,        44,        44,        40,        40,        80,        80,        80},      // ORKScreenMetricIconImageViewToCaptionBaseline
        {         30,        30,        30,        26,        22,        30,        30,        30},      // ORKScreenMetricVerificationTextBaselineToResendButtonBaseline
    };
    return metrics[metric][screenType];
}

CGFloat ORKGetMetricForWindow(ORKScreenMetric metric, UIWindow *window) {
    CGFloat metricValue = 0;
    switch (metric) {
        case ORKScreenMetricContinueButtonWidth:
        case ORKScreenMetricHeadlineSideMargin:
        case ORKScreenMetricLearnMoreButtonSideMargin:
            metricValue = ORKGetMetricForScreenType(metric, ORKGetHorizontalScreenTypeForWindow(window));
            break;
            
        default:
            metricValue = ORKGetMetricForScreenType(metric, ORKGetVerticalScreenTypeForWindow(window));
            break;
    }
    
    return metricValue;
}

const CGFloat ORKLayoutMarginWidthRegularBezel = 15.0;
const CGFloat ORKLayoutMarginWidthThinBezelRegular = 20.0;
const CGFloat ORKLayoutMarginWidthiPad = 0.0;

static CGFloat ORKStandardLeftTableViewCellMarginForWindow(UIWindow *window) {
    CGFloat margin = 0;
    switch (ORKGetHorizontalScreenTypeForWindow(window)) {
        case ORKScreenTypeiPhone4:
        case ORKScreenTypeiPhone5:
        case ORKScreenTypeiPhone6:
            margin = ORKLayoutMarginWidthRegularBezel;
            break;
        case ORKScreenTypeiPhone6Plus:
        case ORKScreenTypeiPad:
        case ORKScreenTypeiPad10_5:
        case ORKScreenTypeiPad12_9:
        default:
            margin = ORKLayoutMarginWidthThinBezelRegular;
            break;
    }
    return margin;
}

CGFloat ORKStandardLeftMarginForTableViewCell(UITableViewCell *cell) {
    return ORKStandardLeftTableViewCellMarginForWindow(cell.window);
}

static CGFloat ORKStandardHorizontalAdaptiveSizeMarginForiPadWidth(CGFloat screenSizeWidth, UIWindow *window) {
    // Use adaptive side margin, if window is wider than iPhone6 Plus.
    // Min Marign = ORKLayoutMarginWidthThinBezelRegular, Max Marign = ORKLayoutMarginWidthiPad or iPad12_9
    
    CGFloat ratio =  (window.bounds.size.width - ORKiPhone6PlusScreenSize.width) / (screenSizeWidth - ORKiPhone6PlusScreenSize.width);
    ratio = MIN(1.0, ratio);
    ratio = MAX(0.0, ratio);
    return ORKLayoutMarginWidthThinBezelRegular + (ORKLayoutMarginWidthiPad - ORKLayoutMarginWidthThinBezelRegular)*ratio;
}

static CGFloat ORKStandardHorizontalMarginForWindow(UIWindow *window) {
    window = ORKDefaultWindowIfWindowIsNil(window); // need a proper window to use bounds
    CGFloat margin = 0;
    switch (ORKGetHorizontalScreenTypeForWindow(window)) {
        case ORKScreenTypeiPhone4:
        case ORKScreenTypeiPhone5:
        case ORKScreenTypeiPhone6:
        case ORKScreenTypeiPhoneX:
        case ORKScreenTypeiPhoneXSMax:
        case ORKScreenTypeiPhone6Plus:
        default:
            margin = ORKStandardLeftTableViewCellMarginForWindow(window);
            break;
        case ORKScreenTypeiPad:{