установка изображения для UIBarButtonItem - изображение растянуто

Когда я пытаюсь использовать «initWithImage» UIBarButtonItem для инициализации пользовательского изображения панели навигации, оно получается размытым и растянутым на черной панели навигации. Вот как я его создаю:

UIBarButtonItem *button = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"gear.png"] style:UIBarButtonItemStyleBordered target:self action:@selector(showSetting:)];

Вот как это выглядит:

введите здесь описание изображения

Есть идеи, если это проблема с изображением? Я получил его из набора иконок, которые я купил.


person Z S    schedule 18.08.2011    source источник


Ответы (6)


Отображаемые изображения на элементах кнопок панели «производны» из исходного изображения (при рендеринге используются только значения альфа-канала, но на вашем изображении все выглядит нормально). Возможно, это просто неправильный размер - вам может потребоваться открыть файл изображения и обрезать его до нужного размера.

Вы также можете попробовать посмотреть, можно ли использовать настройку свойства imageInsets (унаследованного UIBarButtonItem от UIBarItem) для настройки размера таким образом, чтобы остановить его растяжение.

Doco на изображениях элементов бара говорит следующее:

Изображения, отображаемые на панели, получены из этого изображения. Если это изображение слишком велико, чтобы поместиться на панели, оно масштабируется, чтобы соответствовать. Как правило, размер изображения панели инструментов и панели навигации составляет 20 x 20 точек.

person gamozzii    schedule 18.08.2011
comment
Изображение было 40x40... обрезка до 30x30 делает его похожим на правильный размер, но оно все еще серое. Думаю, мне следует сделать внутреннюю часть шестерни белой, чтобы она соответствовала тексту? - person Z S; 18.08.2011

Лучший способ сделать это — создать кнопку, установить ее фоновое изображение и установить ее действие. Затем можно создать UIBarButtonItem, используя эту кнопку в качестве пользовательского представления. Вот мой пример кода:

 UIButton *settingsView = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 61, 30)];
[settingsView addTarget:self action:@selector(SettingsClicked) forControlEvents:UIControlEventTouchUpInside];
[settingsView setBackgroundImage:[UIImage imageNamed:@"settings"] forState:UIControlStateNormal];
UIBarButtonItem *settingsButton = [[UIBarButtonItem alloc] initWithCustomView:settingsView];
[self.navigationItem setRightBarButtonItem:settingsButton];
person Jeff Schmitz    schedule 12.07.2012
comment
Спасибо - это была очень хорошая работа для меня. У меня есть изображение, которое я хотел уменьшить, и это был довольно простой способ сделать это. Я создал вторую версию своего изображения, используя imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate], чтобы оно было соответствующим образом окрашено. - person mdebeus; 15.04.2014
comment
Это растягивает мой образ - person TheTravloper; 28.02.2019

Я знаю, что этот вопрос уже отмечен галочкой. Но я столкнулся с этим сегодня и подумал, что все равно предложу свой ответ. Отмеченный галочкой ответ выше действительно помог мне, но мне также потребовались дополнительные эксперименты, чтобы понять, что на самом деле происходит.

Изображение кнопки сжимается только по оси x, а не по оси y. это потому, что он слишком высок для кнопки и сжимается, чтобы соответствовать. Но это не уменьшает его пропорционально. Только по вертикали. Так он выглядит растянутым. На самом деле он не растянут, что подразумевает его расширение. Вместо этого высота уменьшается. Знание разницы, я думаю, важно для понимания того, почему это происходит и как это исправить.

введите здесь описание изображения

Я сделал то же самое, что и ОП. Думая, что я поддерживаю сетчатку, я сделал свою иконку 40x40. У меня была зеленая галочка с альфа-каналом. Он был дополнен пустыми пикселями до размера 40x40. Приложение изменило его размер, чтобы он соответствовал доступной высоте кнопки. Но ширина осталась прежней. Так что стало где-то в пределах 40х30 или 40х20. Я думаю, что кнопка может справиться со значком высотой 30, но тогда она слишком велика для коробки, ИМХО.

OP уменьшил кнопку до 30x30, и это больше не хлюпает. Но это не лучшее решение. Потому что на самом деле это не кнопка сетчатки, когда вы это делаете. Он сжался, а затем снова увеличился на сетчатке.

Правильный ответ — назвать вашу версию высотой 40 пикселей с помощью @2x, а затем создать версию половинного размера (высотой 20 пикселей) и сохранить ее без @2x. Ширина может быть любой. Затем загрузите с помощью imageNamed: без указания @2x. Он будет использовать соответствующий png для устройства с сетчаткой или без сетчатки.

Следующее, что случилось со мной, это то, что рамка кнопки была слишком маленькой. Поэтому я увеличил размер холста в psd, чтобы увеличить ширину png до 80, чтобы сделать кнопку немного шире и более удобной для нажатия.

person badweasel    schedule 18.11.2013
comment
Очень полезный ответ! Зеленая галочка в вашем посте оправдана =) - person Ray; 01.10.2015

растяжение

У меня возникла та же проблема с растягиванием для моего изображения 40x40, когда я установил фоновое изображение для leftBarButtonItem.

UIBarButtonItem *backButton = [UIBarButtonItem new];
[backButton setBackButtonBackgroundImage:[UIImage imageNamed:@"back_icon"] forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];

self.navigationItem.leftBarButtonItem = backButton;

Но моя проблема была решена с помощью следующего кода

разрешено

UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"back_icon"] style:UIBarButtonItemStylePlain target:self action:@selector(handleBack:)];

self.navigationItem.leftBarButtonItem = backButton;

и тот же результат, если используется UIBarButtonItemStyleBordered.

person zeeawan    schedule 01.02.2015
comment
безусловно лучший ответ, легко исправить - person Ethan Parker; 07.09.2017

Сначала установите правильный размер изображения: @1x = 22px, @2x = 44px, @3x = 88px.

потом

let leftBarButtonItem = UIBarButtonItem(image: yourUIImage, style: .plain, target: self, action: #selector(action))
leftBarButtonItem.tintColor = UIColor.red
navigationItem.leftBarButtonItem = leftBarButtonItem

or

let btn = UIButton(type: .custom)
btn.addTarget(self, action: #selector(contactMe), for: .touchUpInside)
btn.setImage(#imageLiteral(resourceName: "open"), for: .normal)
person William Hu    schedule 08.10.2017

Для тех, кто столкнулся с этой проблемой растяжения элемента панели инструментов, в частности, в iOS 11, похоже, что версия @2x вашего изображения теперь требуется для рендеринга его рамки и/или границ.

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

UIButton *tagsBtn = [UIButton buttonWithType:UIButtonTypeCustom];
tagsBtn.bounds = CGRectMake( 0, 0, 40, 40);
[tagsBtn setImage:[UIImage imageNamed:@"tags.png"] forState:UIControlStateNormal];
tags = [[UIBarButtonItem alloc] initWithCustomView:tagsBtn];
[tagsBtn addTarget:self action:@selector(tags:) forControlEvents:UIControlEventTouchUpInside];

[bottomToolbar setItems:[NSArray arrayWithObjects:flexibleSpace,tags,flexibleSpace,nil]];

Тогда вам понадобится файл [email protected] размером 80x80, даже если ваше изображение tags.png имеет размер 80x80. Простое переименование tags.png в [email protected] изменит размер изображения до 40x40, как это было до iOS 11, без изменения кода, или просто добавьте [email protected] в свой проект.

person whyoz    schedule 04.10.2017