【问题标题】:Can I have a UIBarButtonItem with a colored image?我可以有一个带有彩色图像的 UIBarButtonItem 吗?
【发布时间】:2009-12-02 19:30:28
【问题描述】:

我想在 UIBarButtonItem 上显示一个图像,但由于某种原因,它只显示了它的轮廓,其余的都是白色的。我怎样才能让它实际显示图像?

谢谢!

【问题讨论】:

    标签: iphone objective-c uibarbuttonitem


    【解决方案1】:

    还有其他iOS7+解决方案:

    NSString *iconFilename = // ...
    UIImage *image = 
        [[UIImage imageNamed:iconFilename] 
            imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
    UIBarButtonItem *barButtonItem = 
        [[UIBarButtonItem alloc] initWithImage:image
                                         style:UIBarButtonItemStylePlain 
                                        target:self 
                                        action:@selector(onBarButtonItemTapped:)];
    

    斯威夫特 5:

    let iconFilename: String = // ...
    let image = UIImage(named: iconFilename)?.withRenderingMode(.alwaysOriginal)
    let barButtonItem = UIBarButtonItem(image: image, 
                                        style: .plain, 
                                        target: self, 
                                        action: #selector(onBarButtonItemTapped(_:)))
    

    从 UIImage.h 中提取:

    ...导航栏、标签栏、工具栏和分段控件自动将其前景图像视为模板...您可以使用 UIImageRenderingModeAlwaysTemplate 强制您的图像始终呈现为模板或 UIImageRenderingModeAlwaysOriginal 强制您的图像始终呈现为原件。

    【讨论】:

    • @Apfelsaft - 如果 iOS 7 存在于 2009 年,当问题被问到时,它可能会是 :) 我已经编辑了接受的答案以链接到这个。
    【解决方案2】:

    更新:请参阅MANIAK_dobrii's answer 以获得更简单的解决方案,在 iOS 7+ 中可用。


    这是我如何为 UIBarButtonItem 使用图像:

    UIImage *image = [UIImage imageNamed:@"buttonImage.png"];
    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
    button.bounds = CGRectMake( 0, 0, image.size.width, image.size.height );    
    [button setImage:image forState:UIControlStateNormal];
    [button addTarget:myTarget action:@selector(myAction) forControlEvents:UIControlEventTouchUpInside];    
    UIBarButtonItem *barButtonItem = [[UIBarButtonItem alloc] initWithCustomView:button];
    …
    

    【讨论】:

    • 如果您想要按钮上的标题,您可能需要将 setImage 行更改为 setBackgroundImage。如果没有,那么上面的代码就可以了。
    • 不要忘记button.showsTouchWhenHighlighted = YES,这样按钮在点击时会像标准 UIBarButtonItem 一样发光。
    • 知道如何使图像变白,就像工具栏一样?
    • 使用@MANIAK_dobrii 的答案。不需要自定义视图,这是更好的答案。
    • @StaRbUck42 尝试增加 UIButton 的高度以匹配工具栏的高度而不是图像的高度。这对我有用。
    【解决方案3】:

    还有另一种完全不涉及编码的方式。

    首先,将要放置的图片放在 Assets.xcassets 文档的栏上。

    在资源浏览器中选择图片。

    在右侧垂直工具栏上打开该图像的属性检查器。

    在“渲染为”中选择“原始图像”。

    即使在情节提要上,按钮将继续使用淡色绘制,但在模拟器上运行时,将显示原始图像。

    图像的默认渲染模式因一个 UI 控件而异。但是,如果您在属性检查器上设置此参数,则可以强制图像始终以特定的渲染模式表示。

    如果您需要在不同的控制器上用不同的渲染模式来表示相同的图像,那么来自 MANIAK_dobrii 的响应更合适。

    【讨论】:

    • 谢谢,这更干净了
    • 现象级的。这太棒了!
    • 这应该是答案。谢谢!
    【解决方案4】:

    在 Swift 3 中:

    let iconname = // ...
    let image = UIImage(named: iconname)?.withRenderingMode(.alwaysOriginal)
    let barButtonItem = UIBarButtonItem(image: image, style: .plain, target: self, action: #selector(self. onBarButtonItemTapped))
    self.navigationItem.leftBarButtonItem = barButtonItem
    

    【讨论】:

    • 也适用于 UIButton 和多色图像!谢谢!
    【解决方案5】:

    不。正如您在Human Interface Guidelines中看到的那样

    确定图标的外观后,请在创建图标时遵循以下准则:

    使用 PNG 格式。 使用带有适当 alpha 的纯白色。 不包括投影。 使用抗锯齿。 如果您决定添加一个斜角,请确保它是 90°(为了帮助您做到这一点,想象一个位于图标顶部的光源)。 对于工具栏和导航栏图标,创建一个大小约为 20 x 20 像素的图标。 对于标签栏图标,请创建一个尺寸约为 30 x 30 像素的图标。

    注意:您为工具栏、导航栏和标签栏提供的图标用作掩码来创建您在应用程序中看到的图标。 不必创建全彩图标。

    【讨论】:

      猜你喜欢
      • 2016-09-22
      • 2017-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多