Подтвердить что ты не робот

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

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

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

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

enter image description here

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

Лучший способ сделать это - создать кнопку, установить фоновое изображение и установить его действие. Затем 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];

Ответ 3

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

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

enter image description here

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

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

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

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

Ответ 4

stretch

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

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

self.navigationItem.leftBarButtonItem = backButton;

Но мой вопрос получил разрешен со следующим кодом

resolved

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

self.navigationItem.leftBarButtonItem = backButton;

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

Ответ 5

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

Итак, если у вас есть такой код, где вы добавляете пользовательский образ 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] в ваш проект.

Ответ 6

Установите правильный размер изображения: @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

или

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