Указатель NULL
- это тот, который указывает на никуда. Когда вы разыскиваете указатель p
, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p
является нулевым указателем, местоположение, хранящееся в p
, является nowhere
, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception
.
В общем, это потому, что что-то не было правильно инициализировано.
Отображаемые изображения на элементах линейных кнопок «получены» из исходного изображения (при рендеринге используются только значения альфа-канала, но на вашем изображении все выглядит нормально). Возможно, он просто не подходящего размера - вам может понадобиться открыть файл изображения и обрезать его до нужного размера.
Вы также можете попробовать посмотреть, можно ли использовать настройку свойства imageInsets (унаследованного UIBarButtonItem из UIBarItem ) для настройки размера в способ остановить его растяжение.
Doco на изображениях элементов панели говорит следующее:
Изображения, отображаемые на панели, получены из этого изображения. Если это изображение слишком велико, чтобы поместиться на панели, оно масштабируется, чтобы соответствовать. Как правило, размер изображения панели инструментов и панели навигации составляет 20 х 20 точек.
Я знаю, что этот вопрос уже имеет галочку с галочкой. Но я столкнулся с этим сегодня и подумал, что все равно предложу свой ответ. Помеченный ответ выше помог мне, но потребовались дополнительные эксперименты, чтобы выяснить, что на самом деле происходит.
Изображение кнопки сокращается только по оси x, а не по оси y. это потому, что он слишком высокий для кнопки и сжимает его, чтобы соответствовать. Но это не уменьшает его пропорционально. Только по вертикали. Так что кажется растянутым. Это на самом деле не растягивается - что подразумевает его расширение. Вместо этого высота уменьшается. Зная разницу, я думаю, важно понять, почему это происходит и как это исправить.
Я сделал то же самое, что и ОП. Думая, что я поддерживаю сетчатку, я сделал свою иконку 40х40. У меня была зеленая галочка с альфа-каналом. Он был дополнен пустыми пикселями до 40х40. Приложение изменило размеры, чтобы оно соответствовало доступной высоте кнопки. Но ширина осталась прежней. Так стало где-то в диапазоне 40х30 или 40х20. Я думаю, что кнопка может обрабатывать значок высотой 30, но тогда она слишком велика для коробки IMHO.
ОП уменьшил кнопку до 30х30, и это больше не давило нажатия. Но это не лучшее решение. Потому что на самом деле это не кнопка сетчатки, когда вы делаете это. Он сжимается, а затем взорван на сетчатке.
Правильный ответ - назовите версию 40 пикселей в высоту с @ 2x, а затем сделайте версию половинного (20 пикселей в высоту) и сохраните ее без @ 2x. Ширина может быть любой. Затем загрузите с imageNamed: без указания @ 2x. Он будет использовать соответствующий PNG для устройства сетчатки или не сетчатки.
Следующее, что случилось со мной, было то, что рамка кнопки была слишком маленькой. Поэтому я увеличил размер холста в psd, чтобы увеличить ширину png до 80, чтобы сделать кнопку немного шире и более легко нажимаемой.
Установите правильный размер изображения: @ 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)