UIButton의 imageSize를 조정하는 방법은 무엇입니까?


158

UIButton의 이미지 크기를 어떻게 조정할 수 있습니까? 이미지를 다음과 같이 설정하고 있습니다.

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

그러나 이것은 이미지를 전체 버튼으로 채 웁니다. 이미지를 더 작게 만들려면 어떻게합니까?


6
이미지를 더 작게 (LOL) 만들어 보셨습니까?
CodaFi

1
@CodaFi는 옳습니다. 일반적으로 CPU에 대한 작업을 줄이고 메모리를 적게 사용하며 스케일링 아티팩트를 잠재적으로 도입하지 않기 때문에 더 잘 보일 것입니다.
Paul.s

또한 버튼을 이미지 크기로 만들 수 있습니다 (또는 그 반대). 작은 이미지가있는 큰 버튼이있는 이유 ... 작은 이미지를 추가하십시오. 단순히 원하는 이미지를 추가하십시오. 다른 사람들이 명확한 생각을 갖도록 구현하려는 논리를 설명하십시오.
Abhishek Singh 2:14에

답변:


243

내가하려는 일을 올바르게 이해하면 이미지 가장자리 삽입 버튼을 사용해야합니다. 다음과 같은 것 :

myLikesButton.imageEdgeInsets = UIEdgeInsets(top, left, bottom, right)

96

Tim의 대답은 정확하지만 내 경우에는 더 간단한 해결책이 있었기 때문에 다른 제안을 추가하고 싶었습니다.

UIButton버튼의 콘텐츠 모드를 설정할 수 있다는 것을 알지 못했기 때문에 이미지 삽입 을 설정 UIImageView하려고했습니다 .UIEdgeInsets 및 하드 코딩 된 값을 모두 사용할 필요가 없었습니다. 버튼에서 기본 이미지보기에 액세스하고 컨텐츠 모드를 설정하십시오.

myButton.imageView.contentMode = UIViewContentModeScaleAspectFit;

UIButton이 콘텐츠 모드 설정을 수신하지 못합니까?를 참조하십시오 .

스위프트 3

myButton.imageView?.contentMode = .scaleAspectFit

1
backgroundImage에 대해 동일한 작업을 수행하는 방법은 무엇입니까?
Sergey Sahakyan

myButton.backgroundImageView? .contentMode = .scaleAspectFit
Andrea.Ferrando

@ Andrea.Ferrando button.backgroundImageView.contentMode가 작동하지 않음
Seong Lee

시간을 절약하고 배경 이미지가 아닌 이미지를 설정하고 있는지 확인하십시오! @SeongLee는 contentMode 또는 EdgeInserts로 배경 이미지를 조작 할 수 없습니다.
redPanda

42

스위프트 3 :

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

6
이것은 나를 위해 아름답게 작동했습니다. Inkscape 내에서 PDF 아이콘을 만들었으며 원하는 contentVerticalAlignment/contentHorizontalAlignment옵션으로 크기를 조정할 수있었습니다. 이것을 게시 해 주셔서 감사합니다.
Adrian

2
설정 contentHorizontalAlignmentcontentVerticalAlignment트릭
톰 크나 펜

1
이 솔루션은 아이콘에 PDF 자산을 사용할 때 효과적입니다. 감사합니다!
Eneko Alonso

38

이와 같은 인터페이스 빌더에서이를 수행 할 수도 있습니다.

여기에 이미지 설명을 입력하십시오

도움이 될 것 같습니다.


26

이미지가 너무 크면 (그리고 이미지를 작게 만들거나 할 수없는 경우) 처음 두 답변의 조합이 효과적입니다.

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

이미지 삽입물을 바로 가져 오지 않으면을 변경하지 않고 이미지가 기울어 contentMode집니다.


23

imageEdgeInsets버튼 이미지 주위의 사각형에 대한 시작 또는 시작 여백 속성 을 사용할 수 있습니다 .

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

양수 값은 해당 에지를 축소하거나 삽입합니다. 음수 값은 해당 가장자리를 확장하거나 시작합니다.


17

UIButton의 imageView를 스케일링하는 다른 솔루션은 다음과 같습니다.

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

당신은 내 하루를 구했습니다. 방금 버튼 안에 이미지 크기를 조정하고 싶었습니다. 아무런 삽입도 없습니다. 감사합니다!
페드로 안토니오

15

스위프트 버전은 다음과 같습니다.

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

8

스위프트 4

이 두 줄의 코드를이 순서대로 사용해야합니다. 가장자리 삽입물의 상단 및 하단 값을 변경하기 만하면됩니다.

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

EXC_BAD_ACCESS에서 호출 할 때 오류가 발생했습니다 override func layoutSubviews().
앤드류 키르 나

7

의 도움으로 팀 C의 대답 , 나는에 확장 만들 수 있었다 UIButton당신이 사용하여 이미지 프레임을 지정할 수 있습니다 스위프트를 사용하여 .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
)

4
당신은해야한다 if let대신하는 경우 검사 frame입니다 nil다음과 엄청나게 많은 시간을 풀기 강제로 .
fpg1503

7

로 아이콘 크기를 변경할 때 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)

여기에 이미지 설명을 입력하십시오

ABS (100-(40 + 40)) = ABS (100-(60 + 60))이므로 예제 1과 3은 동일합니다.


2

스위프트 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)

2

한 가지 방법은 다음과 같은 코드로 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

스위프트> 5 업데이트

크기를 설정하십시오.

button.frame = CGRect(x: 0, y: 0, width: 44, height: 44)

여백 설정 :

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

1

스위프트 3 업데이트

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

-6

나는 당신의 이미지 크기가 버튼 크기와 동일하다고 생각하고 다음과 같이 버튼의 배경에 이미지를 넣습니다.

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

당신은 동일한 크기의 이미지와 버튼을 가지고 있습니다. 내 요점을 이해하기를 바랍니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.