ios - UIBarButtonItem 上没有阴影/浮雕

标签 ios cocoa-touch uiimage uibarbuttonitem

自定义 UIBarButtonItem 有问题。当我通过

创建自定义 UIBarButtonItem 时
 [[UIBarButtonItem alloc]initWithImage:[UIImage imageNamed:@"FilterIcon.png"] style:UIBarButtonItemStyleBordered target:self action:@selector(filterTouched:)];

生成的按钮没有“浮雕”外观,系统项目通过在其图标后面放置一个半透明的黑色阴影来实现。

Left: system item, right: custom item

在左侧您可以看到“组织”系统栏按钮项,右侧是上面代码的结果。

在资源中创建阴影是徒劳的,因为 iOS/Cocoa 只使用图像的 mask 并丢弃任何颜色信息。

有趣的是,如果我在 Interface-Builder 中创建条形按钮项目,它看起来不错。但是,在我的问题上下文中,我需要在代码中创建按钮项。

最佳答案

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

关于ios - UIBarButtonItem 上没有阴影/浮雕,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11083335/

相关文章:

iphone - 缩小然后关闭 UIView 的问题

ios - 绘制 UIView 并转换为 UIImage

ios - 获取值 NSDictionary 的索引

ios - Swift - 在 UIView 的两个子类中重写一个方法

ios - iOS6 中 MKUserTrackingModeFollowWithHeading 错误的任何解决方法?

ios - 从图像文件创建 CIImage 模式

ios - 如何删除UIImageView的最后一张图片?

iphone - 如何仅从右向左扩展 UIButton 宽度

ios - "Error Domain=NEVPNErrorDomain Code=1\"(null)\""连接 VPN 服务器时

ios - 在更改 View (Segue) 时显示事件指示器并为下一个 View (API) 加载数据