IOS / Objective-C: назначить пользовательское изображение для UIBarButtonItem - PullRequest
0 голосов
/ 21 мая 2018

Я могу назначить некоторые изображения элементу 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];

Ответы [ 3 ]

0 голосов
/ 21 мая 2018

Проблема в режиме рендеринга.При создании экземпляра UIImage его свойство renderingMode имеет значение по умолчанию UIImageRenderingModeAutomatic.Теперь из документации этого режима рендеринга:

Используйте режим рендеринга по умолчанию для контекста, в котором используется изображение.

ДляUIBarButtonItem Режим рендеринга по умолчанию UIImageRenderingModeAlwaysTemplate, который создает фактически отображаемое изображение на основе альфа-канала исходного изображения.

Что вы хотите сделать, это изменить режим рендеринга вашего изображения на 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];

Это обеспечивает отображение исходного изображения вместо изображения, созданного из альфа-канала.

0 голосов
/ 21 мая 2018

Хорошо, сделайте одну вещь, сделайте UIBarButtonItem программно в представленииWillAppear

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;
0 голосов
/ 21 мая 2018

Я бы сделал что-то вроде этого:

 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];
...