it-swarm.com.ru

Как настроить размер изображения UIButton?

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

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

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

127
adit

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

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

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

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

myButton.imageView.contentMode = UIViewContentModeScaleAspectFit;

Смотрите IButton не слушает настройки режима контента?

Swift 3

myButton.imageView?.contentMode = .scaleAspectFit
84
Kyle Clegg

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

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

Положительное значение сокращает, или вставляет, этот край - движется. Отрицательное значение расширяет или опускает этот Edge.

23
safaa elgendi

Свифт 3:

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

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

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

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

19
iosjillian

Вот версия Swift:

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

Swift 4

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

addButton.imageView?.contentMode = .scaleAspectFit
addButton.imageEdgeInsets = UIEdgeInsetsMake(10.0, 0.0, 10.0, 0.0)
7
Van Du Tran

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

При изменении размера значков с помощью 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))

5
Borys Tkachenko

Один из подходов - изменить размер 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!
}
2
Crashalot

Свифт 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)
1
Drey

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

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