2012-06-18 6 views
6

カスタムUIBarButtonItemに問題があります。私はカスタムUIBarButtonItemを作成するときUIBarButtonItemにシャドウ/エンボスがありません

[[UIBarButtonItem alloc]initWithImage:[UIImage imageNamed:@"FilterIcon.png"] style:UIBarButtonItemStyleBordered target:self action:@selector(filterTouched:)]; 

経由結果のボタンは、システムの項目は、アイコンの後ろに半透明の黒い影を置くことによって達成することを、見て、「エンボス」はありません。左側に

Left: system item, right: custom item

あなたは「整理」システムバーボタンアイテム、上記のコードのrightthe結果を参照してください。

iOS/Cocoaはイメージのマスクのみを使用し、色情報を破棄するため、リソースにシャドウを作成するのは無駄です。

面白いことに、Interface-Builderでバーボタンアイテムを作成しても問題ありません。しかし、私の問題の文脈では、コード内にボタンアイテムを作成する必要があります。

答えて

10

James FureyのスクリプトのObjective-Cバージョンがあります。

- (UIImage *)applyToolbarButtonStyling:(UIImage *)oldImage { 
    float shadowOffset = 1; 
    float shadowOpacity = .54; 
    CGRect imageRect = CGRectMake(0, 0, oldImage.size.width, oldImage.size.height); 
    CGRect shadowRect = CGRectMake(0, shadowOffset, oldImage.size.width, oldImage.size.height); 
    CGRect newRect = CGRectUnion(imageRect, shadowRect); 
    UIGraphicsBeginImageContextWithOptions(newRect.size, NO, oldImage.scale); 
    CGContextRef ctx = UIGraphicsGetCurrentContext(); 
    CGContextScaleCTM(ctx, 1, -1); 
    CGContextTranslateCTM(ctx, 0, -(newRect.size.height)); 
    CGContextSaveGState(ctx); 
    CGContextClipToMask(ctx, shadowRect, oldImage.CGImage); 
    CGContextSetFillColorWithColor(ctx, [UIColor colorWithWhite:0 alpha:shadowOpacity].CGColor); 
    CGContextFillRect(ctx, shadowRect); 
    CGContextRestoreGState(ctx); 
    CGContextClipToMask(ctx, imageRect, oldImage.CGImage); 
    CGContextSetFillColorWithColor(ctx, [UIColor colorWithWhite:1 alpha:1].CGColor); 
    CGContextFillRect(ctx, imageRect); 
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    return newImage; 
} 
7

私はこの問題が発生した理由が別の質問にこれらの答えで覆われていると思う:

https://stackoverflow.com/a/3476424/1210490

https://stackoverflow.com/a/6528603/1210490

UIBarButtonItemsは、あなたがプログラム的にそれらを添付する場所に応じて異なる動作をします。それらをツールバーに添付すると、白い「エンボス」アイコンになります。ナビゲーションバーにそれらを添付すると、それらは表示されません。

UIImagesにツールバーのUIBarButtonItemスタイリングを適用する関数を書いて、ここ数時間を費やしました。 それはMonoTouchでのためにC#で書かれていますが、私はあなたがいないproblemoのObj-Cにそれを微調整することができるでしょうと確信している...だから

UIImage ApplyToolbarButtonStyling(UIImage oldImage) 
{ 
    float shadowOffset = 1f; 
    float shadowOpacity = .54f; 
    RectangleF imageRect = new RectangleF(PointF.Empty, oldImage.Size); 
    RectangleF shadowRect = new RectangleF(new PointF(0, shadowOffset), oldImage.Size); 
    RectangleF newRect = RectangleF.Union(imageRect, shadowRect); 
    UIGraphics.BeginImageContextWithOptions(newRect.Size, false, oldImage.CurrentScale); 
    CGContext ctxt = UIGraphics.GetCurrentContext(); 
    ctxt.ScaleCTM(1f, -1f); 
    ctxt.TranslateCTM(0, -newRect.Size.Height); 
    ctxt.SaveState(); 
    ctxt.ClipToMask(shadowRect, oldImage.CGImage); 
    ctxt.SetFillColor(UIColor.FromWhiteAlpha(0f, shadowOpacity).CGColor); 
    ctxt.FillRect(shadowRect); 
    ctxt.RestoreState(); 
    ctxt.ClipToMask(imageRect, oldImage.CGImage); 
    ctxt.SetFillColor(UIColor.FromWhiteAlpha(1f, 1f).CGColor); 
    ctxt.FillRect(imageRect); 
    UIImage newImage = UIGraphics.GetImageFromCurrentImageContext(); 
    UIGraphics.EndImageContext(); 
    return newImage; 
} 

、このように見えるために使用UIBarButtonItem:

UIBarButtonItem barButtonItem = new UIBarButtonItem(ApplyToolbarButtonStyling(UIImage.FromFile("MusicIcon.png")), UIBarButtonItemStyle.Plain, delegate {}); 

は今、次のようになります:このような上記の機能を代わりに作成した

Before

After

が、これは将来的に誰かに役立ちます願っています。

+0

お読みいただきありがとうございます。実際には、これはAppleが矛盾した問題を抱えているように思えます。既定のアプリをいくつか確認したところ、ナビゲーションバーのアイコンの中にはエンボス加工されたものがあります(連絡先のプラスアイコンやメッセージの書き込みボタンなど)。 – Chris

+0

私のおかげで、この精巧な努力のために多くのおかげで。悲しいことに、私はこれを現在のバージョンの製品に組み込む時間がありませんが、次のリリースを試みます。再度、感謝します。 – Chris

0

James Fureyのスクリプトのシャドウオフセットに注意してください。

float shadowOffset = 1.0f // for a UIBarButtonItem in UINavigationItem 
float shadowOffset = 0.0f // for a UIBarButtonItem in UIToolBar 

これはiOSの6.1 SDKで観察された: 私は、次のような経験をしてきました。

(現在はiOS 7で廃止)

関連する問題