Как настроить UIButton imageSize?

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

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

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

Ответ 1

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

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

Ответ 2

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

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

myButton.imageView.contentMode = UIViewContentModeScaleAspectFit;

См. UIButton не прослушивает настройку режима содержимого?

Swift 3

myButton.imageView?.contentMode = .scaleAspectFit

Ответ 3

Вы также можете сделать это из конструктора inteface, как это.

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

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

Ответ 4

Swift 3:

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

Ответ 5

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

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

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

Ответ 6

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

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

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

Ответ 7

Вот версия Swift:

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

Ответ 8

С помощью ответа Tim C мне удалось создать расширение на 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
)

Ответ 9

Swift 4

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

addButton.imageView?.contentMode = .scaleAspectFit
addButton.imageEdgeInsets = UIEdgeInsetsMake(10.0, 0.0, 10.0, 0.0)

Ответ 10

При изменении размера значка с помощью UIEdgeInsetsMake(top, left, bottom, right) учитывать размеры кнопок и способность UIEdgeInsetsMake работать с отрицательными значениями, как если бы они были положительными.

Пример: две кнопки высотой 100 и аспектом 1:1.

left.imageEdgeInsets = UIEdgeInsetsMake(40, 0, 40, 0)
right.imageEdgeInsets = UIEdgeInsetsMake(40, 0, 40, 0)

enter image description here

left.imageEdgeInsets = UIEdgeInsetsMake(40, 0, 40, 0)
right.imageEdgeInsets = UIEdgeInsetsMake(45, 0, 45, 0)

enter image description here

left.imageEdgeInsets = UIEdgeInsetsMake(40, 0, 40, 0)
right.imageEdgeInsets = UIEdgeInsetsMake(60, 0, 60, 0)

enter image description here

Примеры 1 и 3 идентичны, так как ABS (100 - (40 + 40)) = ABS (100 - (60 + 60))

Ответ 11

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

let targetHeight = CGFloat(28)
let newImage = resizeImage(image: UIImage(named: "Image.png")!, targetHeight: targetHeight)
button.setImage(newImage, for: .normal)

fileprivate func resizeImage(image: UIImage, targetHeight: CGFloat) -> UIImage {
    // Get current image size
    let size = image.size

    // Compute scaled, new size
    let heightRatio = targetHeight / size.height
    let newSize = CGSize(width: size.width * heightRatio, height: size.height * heightRatio)
    let rect = CGRect(x: 0, y: 0, width: newSize.width, height: newSize.height)

    // Create new image
    UIGraphicsBeginImageContextWithOptions(newSize, false, 0)
    image.draw(in: rect)
    let newImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()

    // Return new image
    return newImage!
}

Ответ 12

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

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

Ответ 13

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)

Ответ 14

Вот другое решение для масштабирования imageView UIButton.

button.imageView?.layer.transform = CATransform3DMakeScale(0.8, 0.8, 0.8)

Ответ 15

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

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

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