2012-06-18 22 views
6

Mam problem z niestandardowym UIBarButtonItem. Kiedy utworzyć niestandardową UIBarButtonItem poprzezBrak cieniowania/wytłaczania na UIBarButtonItem

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

otrzymany przycisk nie mają „tłoczone” wyglądać, że elementy systemu osiągnąć poprzez umieszczenie półprzezroczystą czarny cień za ich ikony.

Left: system item, right: custom item

Po lewej stronie widać „Organizuj” bar System element przycisk, rightthe wyniku kodu z góry.

Tworzenie cienia w zasobie jest daremne, ponieważ iOS/Cocoa używał tylko maski obrazu i odrzuca wszelkie informacje o kolorach.

Co ciekawe, jeśli utworzę element przycisku paska w programie Interface-Builder, wygląda dobrze. Jednak w kontekście mojego problemu muszę utworzyć element przycisku w kodzie.

Odpowiedz

10

Istnieje wersja skryptu Jamesa Furey'a w wersji 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

myślę, że powód Dzieje są objęte tymi odpowiedziami na Kolejne pytanie:

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

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

UIBarButtonItems zachowują się różnie w zależności od tego, gdzie programowo je dołączyć. Jeśli umieścisz je na pasku narzędzi, staną się one białymi symbolami "wytłoczonymi". Jeśli połączysz je z paskiem nawigacji, nie będą.

Spędziłem kilka ostatnich godzin pisania funkcji, aby zastosować styl paska narzędzi UIBarButtonItem do UIImages. Jest napisany w języku C# dla MonoTouch, ale jestem pewien, że będziesz w stanie dostosować go do Obj-C nie Problemo ...

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; 
} 

Tak, UIBarButtonItem które kiedyś wyglądać tak:

Before

Utworzono zamiast z funkcją powyżej, tak:

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

Czy teraz wyglądać następująco:

After

Nadzieja to pomaga komuś w przyszłości.

+0

Dzięki za przeczytane.Właściwie to wygląda na to, że Apple ma problem z niespójnością. Sprawdziłem domyślne aplikacje, a kilka ikon w Paskach Nawigacyjnych ma wytłoczony wygląd (np. Ikona plus w Kontaktach lub przycisk zapisu w Wiadomościach). – Chris

+0

Mój Boże, bardzo dziękuję za ten skomplikowany wysiłek. Niestety, nie mam czasu na włączenie tego do naszej obecnej wersji produktu, ale spróbuję następnego wydania. Dzięki jeszcze raz. – Chris

0

Zwróć uwagę na przesunięcie cienia w skrypcie Jamesa Fureya. Zrobiłem następujące doświadczenie:

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

ten zaobserwowano iOS 6.1 SDK.

(teraz przestarzałe pod iOS 7)

Powiązane problemy