Ответ 1
Если я правильно понимаю, что вы пытаетесь сделать, вам нужно сыграть с вставкой с краями кнопок. Что-то вроде:
myLikesButton.imageEdgeInsets = UIEdgeInsetsMake(top, left, bottom, right);
Как я могу настроить размер изображения UIButton? Я устанавливаю изображение так:
[myLikesButton setImage:[UIImage imageNamed:@"icon-heart.png"] forState:UIControlStateNormal];
Однако это заполняет изображение до полной кнопки, как я могу уменьшить изображение?
Если я правильно понимаю, что вы пытаетесь сделать, вам нужно сыграть с вставкой с краями кнопок. Что-то вроде:
myLikesButton.imageEdgeInsets = UIEdgeInsetsMake(top, left, bottom, right);
Ответ Тима правильный, однако я хотел добавить другое предложение, потому что в моем случае было более простое решение.
Я искал установку вставки UIButton
, потому что не понял, что могу установить режим содержимого на кнопке UIImageView
, что помешало бы полностью использовать UIEdgeInsets и жестко закодированные значения. Просто войдите в базовое изображение на кнопке и установите режим содержимого:
myButton.imageView.contentMode = UIViewContentModeScaleAspectFit;
См. UIButton не прослушивает настройку режима содержимого?
Swift 3
myButton.imageView?.contentMode = .scaleAspectFit
Вы также можете сделать это из конструктора inteface, как это.
Я думаю, что это полезно.
Swift 3:
button.setImage(UIImage(named: "checkmark_white"), for: .normal)
button.contentVerticalAlignment = .fill
button.contentHorizontalAlignment = .fill
button.imageEdgeInsets = UIEdgeInsetsMake(10, 10, 10, 10)
вы можете использовать свойство imageEdgeInsets
Вставка или исходные поля для прямоугольника вокруг изображения кнопок.
[self.btn setImageEdgeInsets:UIEdgeInsetsMake(6, 6, 6, 6)];
Положительное значение сжимается, или вставки, которые перемещаются по краю. Отрицательное значение расширяет или завершает этот ребро.
Если ваше изображение слишком велико (и вы не можете/не хотите просто уменьшить его), комбинация первых двух ответов работает отлично.
addButton.imageView?.contentMode = .scaleAspectFit
addButton.imageEdgeInsets = UIEdgeInsetsMake(15.0, 15.0, 15.0, 5.0)
Если вы правильно не установите изображения, изображение будет перекошено без изменения contentMode
.
Вот версия Swift:
myButton.imageEdgeInsets = UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10)
С помощью ответа 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
)
Swift 4
Вам нужно будет использовать эти две строки кода в указанном порядке. Все, что вам нужно, это изменить верхнее и нижнее значение краевых вставок.
addButton.imageView?.contentMode = .scaleAspectFit
addButton.imageEdgeInsets = UIEdgeInsetsMake(10.0, 0.0, 10.0, 0.0)
При изменении размера значка с помощью UIEdgeInsetsMake(top, left, bottom, right)
учитывать размеры кнопок и способность UIEdgeInsetsMake работать с отрицательными значениями, как если бы они были положительными.
Пример: две кнопки высотой 100 и аспектом 1:1.
left.imageEdgeInsets = UIEdgeInsetsMake(40, 0, 40, 0)
right.imageEdgeInsets = UIEdgeInsetsMake(40, 0, 40, 0)
left.imageEdgeInsets = UIEdgeInsetsMake(40, 0, 40, 0)
right.imageEdgeInsets = UIEdgeInsetsMake(45, 0, 45, 0)
left.imageEdgeInsets = UIEdgeInsetsMake(40, 0, 40, 0)
right.imageEdgeInsets = UIEdgeInsetsMake(60, 0, 60, 0)
Примеры 1 и 3 идентичны, так как ABS (100 - (40 + 40)) = ABS (100 - (60 + 60))
Один из подходов - изменить размер 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!
}
Обновлено для Swift 3
yourButtonName.imageEdgeInsets = UIEdgeInsetsMake(10, 10, 10, 10)
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)
Вот другое решение для масштабирования imageView UIButton.
button.imageView?.layer.transform = CATransform3DMakeScale(0.8, 0.8, 0.8)
Я думаю, ваш размер изображения также такой же, как размер кнопки, тогда вы помещаете изображение в фоновом режиме кнопки, например:
[myLikesButton setBackgroundImage:[UIImage imageNamed:@"icon-heart.png"] forState:UIControlStateNormal];
у вас мачта одинакового размера изображения и кнопки. Надеюсь, вы понимаете мою мысль.