Простой способ поместить UIImage в UIButton - PullRequest
12 голосов
/ 21 декабря 2010

У меня в приложении для iPhone есть кнопка UIB. Я установил его размер на 100x100.

У меня есть изображение размером 400x200, которое я хочу отобразить на кнопке.

Кнопка STILL должна оставаться на 100x100 ... и я хочу, чтобы изображение уменьшилось, чтобы соответствовать ... но сохраняйте правильное соотношение сторон.

Я думал, что именно для этого и был использован «Аспектный подбор».

Включить ли мое изображение в setImage или setBackgroundImage?

Настроить ли AspectFit для кнопки? или изображение? или фоновое изображение?

(Мне нужно, чтобы небольшие изображения увеличивались в размере. В то время как большие изображения должны уменьшаться в размере. Всегда держите кнопку на 100х100.)

Я пробовал бесчисленное множество комбинаций всего вышеперечисленного ... и я просто не могу понять, все для работы одновременно:

  • Не меняйте размер кнопки 100x100.
  • Не разрушайте пропорции изображения.
  • Всегда увеличивайте маленькие изображения, чтобы соответствовать кнопке.
  • Всегда уменьшайте большие изображения до размера кнопки.
  • Никогда не обрезайте края изображения.
  • Никогда не требуйте взлома "положить UIButtons поверх всех ваших UIimages".
  • Не требуется, чтобы все обновлялись до v4.2.1 только для использования новых методов фреймворка.

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

Тьфу.

Ответы [ 8 ]

12 голосов
/ 22 декабря 2010

UIB кнопка не работает. Это короткий ответ. UIImageView s в его свойствах image и backgroundImage не соответствуют настройкам UIViewContentMode. Они доступны только для чтения, и, хотя содержимое UIImage этих UIImageViews можно задать с помощью методов setImage: и setBackgroundImage:, режим содержимого не может быть.

Решение состоит в том, чтобы либо обеспечить правильные размеры изображений в вашем пакете для начала, либо положить UIImageView, сконфигурировать его так, как вы хотите, а затем поместить поверх него прозрачную «пользовательскую» кнопку UIB. Это хак, который обещали использовать все эти модные профессиональные приложения, которые вы видели. Мы все должны это сделать.

6 голосов
/ 15 августа 2013
UIImage *img = [UIImage imageNamed:@"yourImageName"];
button.imageView.contentMode = UIViewContentModeScaleAspectFit;
[button setImage:img forState:UIControlStateNormal];
4 голосов
/ 22 декабря 2010

Чтобы сделать это правильно, я бы фактически программно изменил размер и манипулировал изображением, чтобы получить желаемое соотношение сторон.Это избавляет от необходимости каких-либо взломов иерархии представлений, а также уменьшает любое снижение производительности до одной операции вместо каждой перерисовки.

Этот (непроверенный) код должен помочь проиллюстрировать то, что я имею в виду:

Дайте мне знать, если какая-то часть этого неясна.

2 голосов
/ 22 декабря 2010

Так как ни одна из моих попыток не сработала ....

Может быть, я должен спросить это вместо этого. При использовании UIButton:

Когда DO Я использую setImage вместо setBackgroundImage? (Почему там оба?)

Когда DO Я использую «Aspect Fit» вместо «Center»? (Почему оба изображения растягивают мои изображения, когда я ожидаю, что они «сохраняют пропорции» и «ничего не меняют» соответственно.)

И большой вопрос: почему такая обычная вещь ... такой огромный беспорядок?

Все это было бы решено, если бы я мог найти обходной метод, такой как: Просто используйте вместо этого UIImage и обнаружите TAPS. (Но это, кажется, даже БОЛЬШОЙ кошмар кода.)

Apple, если ты пытался облегчить мою работу ... ты вместо этого сделал это в 400 раз более запутанным.

2 голосов
/ 22 декабря 2010

Я думаю, что Дэн пытается сказать (но никогда не говорит), чтобы сделать это:

  • Используйте «временное изображение» для изменения размера.
  • Для временного изображения необходимо установить ASPECT FIT и HIDDEN.
  • Убедитесь, что на вашей кнопке установлен нужный размер, а НЕ на АСПЕКТ.
// Make a frame the same size as your button
CGRect aFrame = CGRectMake(0, 0, myButton.frame.size.width, myButton.frame.size.height);

// Set your temp-image to the size of your button
imgTemp.frame = aFrame;

// Put your image into the temp-image
imgTemp.image = anImage;

// Copy that resized temp-image to your button
[myButton setBackgroundImage:tempImage forState:UIControlStateNormal]; 
1 голос
/ 21 декабря 2010

Я бы изменил размер изображения до 100x100, сохранив соотношение сторон содержимого, содержащегося в изображении.Затем установите свойство backgroundImage кнопки UIB для изображения.

1 голос
/ 21 декабря 2010

Поместите просмотр изображений поверх кнопки, установите изображение для просмотра изображений, а не для кнопки.

Всего наилучшего.

0 голосов
/ 14 октября 2014

Я столкнулся с той же проблемой несколько дней назад и решил ее. Пожалуйста, попробуйте с этим

[_profilePicBtn setImage:profilePic forState:UIControlStateNormal];
_profilePicBtn.imageView.contentMode = UIViewContentModeScaleAspectFit;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...