2012-06-18 26 views
6

Tôi gặp sự cố với UIBarButtonItem tùy chỉnh. Khi tôi tạo ra một UIBarButtonItem tùy chỉnh thông quaKhông có bóng/dập nổi trên UIBarButtonItem

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

nút kết quả không có "chạm nổi" nhìn, rằng các mục hệ thống đạt được bằng cách đặt một bóng đen bán trong suốt đằng sau biểu tượng của họ.

Left: system item, right: custom item

On rời khỏi bạn hãy xem phần "Tổ chức" thanh hệ thống nút mục, rightthe kết quả của mã từ trên cao.

Tạo bóng trong tài nguyên là vô ích, vì iOS/Cocoa chỉ sử dụng mặt nạ của hình ảnh và loại bỏ bất kỳ thông tin màu nào.

Điều thú vị là, nếu tôi tạo mục nút thanh trong Bộ dựng giao diện thì có vẻ ổn. Tuy nhiên, trong bối cảnh của vấn đề của tôi, tôi cần phải tạo mục nút trong mã.

Trả lời

10

Có phiên bản Objective-C của kịch bản James Furey.

- (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

Tôi nghĩ lý do này xảy ra được bao phủ bởi những câu trả lời cho một câu hỏi khác:

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

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

UIBarButtonItems hành xử khác nhau tùy thuộc vào nơi bạn lập trình đính kèm chúng. Nếu bạn đính kèm chúng vào thanh công cụ, chúng sẽ trở thành biểu tượng "nổi" màu trắng. Nếu bạn đính kèm chúng vào thanh điều hướng, chúng sẽ không.

Tôi đã dành vài giờ qua để viết một hàm để áp dụng kiểu dáng thanh công cụ UIBarButtonItem cho UIImages. Nó được viết bằng C# cho MonoTouch, nhưng tôi chắc chắn bạn sẽ có thể tinh chỉnh nó để obj-C không có 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; 
} 

Vì vậy, một UIBarButtonItem đã từng giống như thế này:

Before

tạo thay vì với chức năng ở trên, như thế này:

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

bây giờ sẽ trông như thế này:

After

Hope this helps ai đó trong tương lai.

+0

Cảm ơn bạn đã đọc.Trên thực tế, điều này có vẻ với tôi như Apple đang có một vấn đề mâu thuẫn ở đó. Tôi đã kiểm tra một số ứng dụng mặc định và một vài biểu tượng trong Thanh điều hướng có giao diện nổi (ví dụ: biểu tượng dấu cộng trong Danh sách liên hệ hoặc nút ghi trong Tin nhắn). – Chris

+0

Gosh của tôi, cảm ơn rất nhiều vì nỗ lực phức tạp này. Đáng buồn thay, tôi không có thời gian để kết hợp điều này vào phiên bản hiện tại của sản phẩm, nhưng sẽ thử bản phát hành tiếp theo. Cảm ơn một lần nữa. – Chris

0

Ghi chú độ lệch bóng trong tập lệnh của James Furey. Tôi đã thực hiện các trải nghiệm sau:

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

Điều này đã được quan sát với SDK iOS 6.1.

(Hiện đã lỗi thời trong iOS 7)

Các vấn đề liên quan