0

私のアプリでBCTabBarControllerを使用しています。イメージを自動的に強調表示するためにCore Graphicsを使用するようにカスタマイズしていますので、各イメージを4枚コピーする必要はありません。Retina UIImageのカスタムUITabBarControllerのようなハイライトのサポート?

ユーザーEphraimにはposted a great starting pointがありますが、レガシーサイズの画像が戻されます(Retina、Retina選択、Legacy、Legacy選択済み)。私はいくつかの設定でプレイしましたが、私はCore Graphicsにあまり慣れていないので、私は暗闇の中で撮影しています。

エフライムのコード:

- (UIImage *) imageWithBackgroundColor:(UIColor *)bgColor 
         shadeAlpha1:(CGFloat)alpha1 
         shadeAlpha2:(CGFloat)alpha2 
         shadeAlpha3:(CGFloat)alpha3 
         shadowColor:(UIColor *)shadowColor 
         shadowOffset:(CGSize)shadowOffset 
         shadowBlur:(CGFloat)shadowBlur { 

UIImage *image = self; 

CGColorRef cgColor = [bgColor CGColor]; 
CGColorRef cgShadowColor = [shadowColor CGColor]; 

CGFloat components[16] = {1,1,1,alpha1,1,1,1,alpha1,1,1,1,alpha2,1,1,1,alpha3}; 
CGFloat locations[4] = {0,0.5,0.6,1}; 

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 

CGGradientRef colorGradient = CGGradientCreateWithColorComponents(colorSpace, components, locations, (size_t)4); 

CGRect contextRect; 
contextRect.origin.x = 0.0f; 
contextRect.origin.y = 0.0f; 
contextRect.size = [image size]; 
//contextRect.size = CGSizeMake([image size].width+5,[image size].height+5); 
// Retrieve source image and begin image context 
UIImage *itemImage = image; 
CGSize itemImageSize = [itemImage size]; 
CGPoint itemImagePosition; 
itemImagePosition.x = ceilf((contextRect.size.width - itemImageSize.width)/2); 
itemImagePosition.y = ceilf((contextRect.size.height - itemImageSize.height)/2); 
UIGraphicsBeginImageContext(contextRect.size); 
CGContextRef c = UIGraphicsGetCurrentContext(); 
// Setup shadow 
CGContextSetShadowWithColor(c, shadowOffset, shadowBlur, cgShadowColor); 
// Setup transparency layer and clip to mask 
CGContextBeginTransparencyLayer(c, NULL); 
CGContextScaleCTM(c, 1.0, -1.0); 
CGContextClipToMask(c, CGRectMake(itemImagePosition.x, -itemImagePosition.y, itemImageSize.width, -itemImageSize.height), [itemImage CGImage]); 
// Fill and end the transparency layer 
CGContextSetFillColorWithColor(c, cgColor);  
contextRect.size.height = -contextRect.size.height; 
CGContextFillRect(c, contextRect); 
CGContextDrawLinearGradient(c, colorGradient,CGPointZero,CGPointMake(contextRect.size.width*1.0/4.0,contextRect.size.height),0); 
CGContextEndTransparencyLayer(c); 
//CGPointMake(contextRect.size.width*3.0/4.0, 0) 
// Set selected image and end context 
UIImage *resultImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

CGColorSpaceRelease(colorSpace); 
CGGradientRelease(colorGradient); 

return resultImage; 

} 

このコードを実装するために、私は私のプロジェクトでUIImageにカテゴリを追加し、その後BCTab.hを次のように変更加えました:

- (id)initWithIconImageName:(NSString *)imageName { 
if (self = [super init]) { 
    self.adjustsImageWhenHighlighted = NO; 
    self.background = [UIImage imageNamed:@"BCTabBarController.bundle/tab-background.png"]; 
    self.rightBorder = [UIImage imageNamed:@"BCTabBarController.bundle/tab-right-border.png"]; 
    self.backgroundColor = [UIColor clearColor]; 

//  NSString *selectedName = [NSString stringWithFormat:@"%@-selected.%@", 
//         [imageName stringByDeletingPathExtension], 
//         [imageName pathExtension]]; 


    UIImage *defImage = [UIImage imageNamed:imageName]; 

    [self setImage:[defImage imageWithBackgroundColor:[UIColor lightGrayColor] shadeAlpha1:0.4 shadeAlpha2:0.0 shadeAlpha3:0.6 shadowColor:[UIColor blackColor] shadowOffset:CGSizeMake(0.0, -1.0f) shadowBlur:3.0] forState:UIControlStateNormal]; 
    [self setImage:[defImage imageWithBackgroundColor:[UIColor redColor] shadeAlpha1:0.4 shadeAlpha2:0.0 shadeAlpha3:0.6 shadowColor:[UIColor blackColor] shadowOffset:CGSizeMake(0.0, -1.0f) shadowBlur:3.0] forState:UIControlStateSelected]; 

} 
return self; 
} 

Ephraim'sコードを網膜ディスプレイで正しく機能させるにはどうすればよいですか?

答えて

0

インターネットを掘った後、a Google searchがStackOverflowに戻ります。 I found this answerthis questionでは、初期化時にUIImageGraphicsContextのスケールファクタを設定するために使用される異なるメソッドについて説明します。

UIGraphicsBeginImageContext(contextRect.size);UIGraphicsBeginImageContextWithOptions(contextRect.size, NO, scale);に変更する必要があり、ここで「scale」は、あなたが使用したいスケールの 値です。私は[[UIScreen mainScreen] scale]からそれをつかんだ。

+1

さらに、スケールには0.0を使用します。その後、UIKitは自動的に画面に適した値を選択します(手動で行っている処理と同じでない場合と同様の処理を行います)。 –

関連する問題