2012-05-14 5 views
89

Как настроить размер изображения UIButton? Я устанавливаю образ как это:Как настроить образ изображения UIButton?

[myLikesButton setImage:[UIImage imageNamed:@"icon-heart.png"] forState:UIControlStateNormal]; 

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

+5

Вы пытались сделать изображение меньшим (LOL)? – CodaFi

+1

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

+0

Также вы можете сделать кнопку на размер изображения (или наоборот). У вас есть большая кнопка ... с небольшим изображением в ней. Просто добавьте изображение, которое вы хотите, вот какие пользовательские кнопки или вы можете объяснить логику, которую вы хотят реализовать для других четкую идею. –

ответ

150

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

myLikesButton.imageEdgeInsets = UIEdgeInsetsMake(top, left, bottom, right); 
-6

я думаю, ваш размер изображения также же, как и размер кнопки, то вы кладете изображение в фоновом режиме кнопки как:

[myLikesButton setBackgroundImage:[UIImage imageNamed:@"icon-heart.png"] forState:UIControlStateNormal]; 

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

16

Вы можете использовать imageEdgeInsets property Вставка или исходные поля для прямоугольника вокруг изображения кнопки.

[self.btn setImageEdgeInsets:UIEdgeInsetsMake(6, 6, 6, 6)]; 

Положительное значение сжимается, или вставки, которые перемещаются по краям. Отрицательное значение расширяет или завершает этот край.

63

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

Я искал, чтобы установить UIButton врезки изображение, потому что я не понимаю, что я мог бы установить режим содержания на кнопки он UIImageView, что предотвратило бы необходимость использовать UIEdgeInsets и жестко закодированные значения в целом. Просто доступ к основной ImageView на кнопку и установить режим содержания:

myButton.imageView.contentMode = UIViewContentModeScaleAspectFit; 

См UIButton doesn't listen to content mode setting?

Swift 3

myButton.imageView?.contentMode = .scaleAspectFit 
+1

Как сделать то же самое для backgroundImage? –

+0

myButton.backgroundImageView? .contentMode = .scaleAspectFit –

+0

@ Andrea.Ferrando 'button.backgroundImageView.contentMode' не работает –

11

Heres Свифта версия:

myButton.imageEdgeInsets = UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10) 
5

С помощью Tim C's answer, я был в состоянии создать расширение на UIButton с помощью Swift, который позволяет указать кадр изображения с помощью функции .setImage() с дополнительным frame параметром

extension UIButton{ 

    func setImage(image: UIImage?, inFrame frame: CGRect?, forState state: UIControlState){ 
     self.setImage(image, forState: state) 

     if let frame = frame{ 
      self.imageEdgeInsets = UIEdgeInsets(
       top: frame.minY - self.frame.minY, 
       left: frame.minX - self.frame.minX, 
       bottom: self.frame.maxY - frame.maxY, 
       right: self.frame.maxX - frame.maxX 
      ) 
     } 
    } 

} 

Используя это, если вы хотите установить кадр UIButton к CGRectMake(0, 0, 64, 64) и установите изображение его на myImage с рамой CGRectMake(8, 8, 48, 48), вы могли бы использовать

let button: UIButton = UIButton(frame: CGRectMake(0, 0, 64, 64)) 
button.setImage(
    myImage, 
    inFrame: CGRectMake(8, 8, 48, 48), 
    forState: UIControlState.Normal 
) 
+2

Вы должны' if let' вместо того, чтобы проверять, является ли 'frame'' nil', а затем [принудительно разворачивать a миллион раз] (https://i.imgflip.com/utfq7.jpg). – fpg1503

10

вы также можете сделать это с inteface строителя, как это.

enter image description here

Я думаю, что это полезно.

7

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

 addButton.imageView?.contentMode = .scaleAspectFit 
     addButton.imageEdgeInsets = UIEdgeInsetsMake(15.0, 15.0, 15.0, 5.0) 

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

5

Swift 3:

button.setImage(UIImage(named: "checkmark_white"), for: .normal) 
button.contentVerticalAlignment = .fill 
button.contentHorizontalAlignment = .fill 
button.imageEdgeInsets = UIEdgeInsetsMake(10, 10, 10, 10) 
1

Обновление для Swift 3

yourButtonName.imageEdgeInsets = UIEdgeInsetsMake(10, 10, 10, 10) 
1

Swift 3

Я установил ширину и высоту MyButton 40 и моя обивка из EdgeInsetsMake 15 со всех сторон , Я предлагаю добавить цвет фона к вашей кнопке, чтобы увидеть фактическое заполнение.

myButton.backgroundColor = UIColor.gray // sample color to check padding 
myButton.imageView?.contentMode = .scaleAspectFit 
myButton.imageEdgeInsets = UIEdgeInsetsMake(15, 15, 15, 15) 
Смежные вопросы