【问题标题】:IOS/Objective-C: Assign custom image to UIBarButtonItemIOS/Objective-C:将自定义图像分配给 UIBarButtonItem
【发布时间】:2018-10-31 07:21:56
【问题描述】:

我能够将一些图像分配给 UIBarButton 项——在 InterfaceBuilder 中轻松地使用简单的线条图标。但是,当我分配全彩色图像时,它会使整个图像成为色调的颜色,默认值为蓝色。如果我将色调设置为清除颜色,图像就会消失。我无法让它显示图像。

我知道可以通过创建 UIImageView、制作按钮并将 UIImageView 分配给按钮来显示图像,但是当其他图像正确显示时,您必须为某些图像处理所有这些麻烦似乎很奇怪只需在 IB 中分配 image 属性。

有没有人知道一种显示彩色图像的方法,而不必经历创建视图等的整个繁琐过程。

类似 btnItem.image = @"myimage.png";

我想避免很长的路......

UIImageView* v = [[UIImageView alloc] initWithFrame:CGRectMake(4, 0, 36, 36)];

UIImage *myImage = [UIImage imageNamed:@"headshot-32.png"];  

v.image =myImage;
UIImage *scaledImage = [UIImage imageWithCGImage:[myImage CGImage] scale:(35) orientation:(myImage.imageOrientation)];
v.image=scaledImage;
v.layer.cornerRadius = v.frame.size.width / 2;
v.contentMode = UIViewContentModeScaleAspectFill;
v.clipsToBounds = YES;

UIBarButtonItem* roundBtn = [[UIBarButtonItem alloc] initWithCustomView:v];
self.navigationItem.leftBarButtonItems = @[roundBtn];

【问题讨论】:

    标签: ios objective-c uiimage uibarbuttonitem


    【解决方案1】:

    问题在于渲染模式。创建UIImage 的实例时,其renderingMode 属性的默认值为UIImageRenderingModeAutomatic。现在,从documentation这个渲染模式:

    对使用图像的上下文使用默认渲染模式。

    UIBarButtonItem 的渲染模式默认为UIImageRenderingModeAlwaysTemplate,它根据源图像的 Alpha 通道创建实际显示的图像。

    您要做的是将图像的渲染模式更改为UIImageRenderingModeAlwaysOriginal

    UIImage *scaledImage = [UIImage imageWithCGImage:[myImage CGImage] scale:(35) orientation:(myImage.imageOrientation)];
    scaledImage.renderingMode = UIImageRenderingModeAlwaysOriginal;
    UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithImage:scaledImage
                                               style:UIBarButtonItemStylePlain
                                               target:yourTarget
                                               action:someSelector];
    

    这可确保显示原始图像,而不是从 Alpha 通道创建的图像。

    【讨论】:

    • 好的。而且我认为没有办法改变IB中的渲染模式?
    • 不是直接的,但是可以查看this answer
    • 我认为您需要使用 alwaysoriginal 渲染模式创建新图像,因为 .rendering mode 属性是只读的
    【解决方案2】:

    我会这样做:

     UIButton *b = [UIButton buttonWithType:UIButtonTypeCustom];
     [b setFrame:CGRectMake(0, 0, 36, 36)];
     [b addTarget:self action:@selector(randomMsg) forControlEvents:UIControlEventTouchUpInside];
     [b setImage:[UIImage imageNamed:@"headshot-32.png"] forState:UIControlStateNormal];
     UIBarButtonItem * roundBtn = [[UIBarButtonItem alloc] initWithCustomView:b];
     self.navigationItem.leftBarButtonItems = @[roundBtn];
    

    【讨论】:

      【解决方案3】:

      好吧,做一件事以编程方式在 viewWillAppear 中制作 UIBarButtonItem

      UIButton *ArrowSnapCapture  = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 40 , 35)];
      [ArrowSnapCapture setImage:[UIImage imageNamed:@"ArrowIcon"] forState:UIControlStateNormal];
      [ArrowSnapCapture addTarget:self action:@selector(CaptureSS) forControlEvents:UIControlEventTouchUpInside];
      UIBarButtonItem *rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:Notification];
      [self.navigationItem setRightBarButtonItem:rightBarButtonItem];
      
      rightBarButtonItem=nil;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-08-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-26
        • 1970-01-01
        相关资源
        最近更新 更多