IOS/Objective-C: 将自定义图像分配给 UIBarButtonItem
IOS/Objective-C: Assign custom image to UIBarButtonItem
我可以将一些图像分配给 UIBarButton 项——在 InterfaceBuilder 中很容易使用简单的线条图标。但是,当我分配一个全彩色图像时,它会使整个图像成为色调的颜色,默认值为蓝色。如果我将色调设置为清晰的颜色,图像就会消失。我无法让它显示图像。
我知道可以通过创建一个 UIImageView、创建一个按钮并将 UIImageView 分配给该按钮来显示一个图像,但是对于某些图像,您必须如此麻烦,而对于其他图像,这似乎很奇怪只需在 IB 中分配图像 属性 即可正确显示。
有没有人知道一种方法来显示彩色图像,而无需经历创建视图等整个过程
类似于 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];
我会这样做:
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];
渲染模式有问题。创建 UIImage
的实例时,其 renderingMode
属性 的默认值为 UIImageRenderingModeAutomatic
。现在,从这个渲染模式的documentation:
Use the default rendering mode for the context where the image is used.
对于 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 通道创建的图像。
好吧,在 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;
我可以将一些图像分配给 UIBarButton 项——在 InterfaceBuilder 中很容易使用简单的线条图标。但是,当我分配一个全彩色图像时,它会使整个图像成为色调的颜色,默认值为蓝色。如果我将色调设置为清晰的颜色,图像就会消失。我无法让它显示图像。
我知道可以通过创建一个 UIImageView、创建一个按钮并将 UIImageView 分配给该按钮来显示一个图像,但是对于某些图像,您必须如此麻烦,而对于其他图像,这似乎很奇怪只需在 IB 中分配图像 属性 即可正确显示。
有没有人知道一种方法来显示彩色图像,而无需经历创建视图等整个过程
类似于 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];
我会这样做:
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];
渲染模式有问题。创建 UIImage
的实例时,其 renderingMode
属性 的默认值为 UIImageRenderingModeAutomatic
。现在,从这个渲染模式的documentation:
Use the default rendering mode for the context where the image is used.
对于 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 通道创建的图像。
好吧,在 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;