4

UITabBarは、デフォルトで微妙なグラデーションを描画します。

UITabBarグラデーションブラック

このルックアンドフィールを任意のtintColorを使用してコードに複製したいと思います。明確にするために、UITabBarにtintColorを設定したくありません(iOS 5以降で可能です)。自分のUIViewでグラデーションを描画したいと思います。

グラデーションを描画する方法を知っています。私の問題は、tintColorからグラデーションの色を導出する方法です。色の明るさを取得し、明るさの設定を変えて他の色を生成することを考えていましたが、それはうまく機能していないようで、見た目ほど良くありません。

カスタム描画グラデーション

オープンソースのTabBarControllerのコードが必要です:https ://github.com/NOUSguide/NGTabBarController

グラデーションを作成するための現在のコードは次のとおりです。

UIColor *baseColor = self.tintColor;
CGFloat hue, saturation, brightness, alpha;

// TODO: Only works on iOS 5
[baseColor getHue:&hue saturation:&saturation brightness:&brightness alpha:&alpha];

// That's the question, how to compute the colors ...
NSArray *colors = [NSArray arrayWithObjects:
                   [UIColor colorWithHue:hue saturation:saturation brightness:brightness+0.2 alpha:alpha],
                   [UIColor colorWithHue:hue saturation:saturation brightness:brightness+0.15 alpha:alpha],
                   [UIColor colorWithHue:hue saturation:saturation brightness:brightness+0.1 alpha:alpha],
                   baseColor, nil];
NSUInteger colorsCount = colors.count;
CGColorSpaceRef colorSpace = CGColorGetColorSpace([[colors objectAtIndex:0] CGColor]);

NSArray *locations = [NSArray arrayWithObjects:[NSNumber numberWithFloat:0.0], 
                      [NSNumber numberWithFloat:0.25], 
                      [NSNumber numberWithFloat:0.49], 
                      [NSNumber numberWithFloat:0.5], nil];
CGFloat *gradientLocations = NULL;
NSUInteger locationsCount = locations.count;

gradientLocations = (CGFloat *)malloc(sizeof(CGFloat) * locationsCount);

for (NSUInteger i = 0; i < locationsCount; i++) {
    gradientLocations[i] = [[locations objectAtIndex:i] floatValue];
}

NSMutableArray *gradientColors = [[NSMutableArray alloc] initWithCapacity:colorsCount];
[colors enumerateObjectsUsingBlock:^(id object, NSUInteger index, BOOL *stop) {
    [gradientColors addObject:(id)[(UIColor *)object CGColor]];
}];

_gradientRef = CGGradientCreateWithColors(colorSpace, (__bridge CFArrayRef)gradientColors, gradientLocations);

if (gradientLocations) {
    free(gradientLocations);
}
4

1 に答える 1

5

これが優れたチュートリアルです:http : //www.raywenderlich.com/2079/core-graphics-101-shadows-and-gloss光沢効果のある部分を見てください。

こちらも:http://cocoawithlove.com/2008/09/drawing-gloss-gradients-in-coregraphics.html

そしてここに完全なコードサンプル:http ://www.mlsite.net/blog/?page_id = 372

于 2012-04-27T22:03:36.947 に答える