代码之家  ›  专栏  ›  技术社区  ›  user6631314

ios/objective-c:将自定义图像分配给uibarbuttoniem

  •  0
  • user6631314  · 技术社区  · 6 年前

    我可以为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];
    
    3 回复  |  直到 6 年前
        1
  •  2
  •   mag_zbc    6 年前

    问题是呈现模式。创建的实例时 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通道创建的图像。

        2
  •  1
  •   Pablo Marrufo    6 年前

    我会这样做:

     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
  •  0
  •   Nayab Muhammad    6 年前

    好吧,做一件事,让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;