UIButton은 iPhone에서 Aspect Fit으로 이동하지 않습니다.


105

몇 개의 UIButton이 있고 IB에서는 Aspect Fit으로 설정되어 있지만 어떤 이유로 항상 늘립니다. 설정해야 할 다른 것이 있습니까? 나는 모든 다른보기 모드를 시도했지만 작동하지 않고 모두 늘어납니다.


@Werner Altesischer의 대답이 옳습니다. 적절하게 변경하십시오.
Harshit Gupta 2014

1
@marty 배경 이미지 또는 이미지를 설정하고 있습니까? 배경 이미지는 지원하지 않고 이미지 만 지원합니다.
Juan Boero

답변:


45

나는 전에 그 문제가 있었다. 나는 내 이미지를 넣어 그것을 해결 UIImageView하는 경우, contentMode설정이 실제로 작동, 투명 정의를 넣어 UIButton그 맨 위에.

편집 :이 대답은 쓸모가 없습니다. 최신 버전의 iOS에서 정답@Werner Altewischer의 답변 을 참조하십시오 .


네 이미지에 수리에있는 버튼을 얻을 수없는 지금을 시도했지만
마티

이 기술로 버튼 상태를 어떻게 관리합니까? "강조 표시"와 같은 사용자 상호 작용에 응답하는 것은 악몽이 될 것 같습니다.
SooDesuNe

3
2.5 년 전에이 질문에 대한 답을 받았을 때 이것이 올바른 방법이었을 수도 있지만 이제 UIButton의 내부 ImageView를 편집하고 거기에서 콘텐츠 모드를 설정할 수 있습니다. @Werner Altewischer의 답변보기
Steve Haley

233

해결책은 contentModeimageView속성 을 설정하는 것 UIButton입니다. 이 UIButton작업을 수행하려면 사용자 지정 형식으로을 만들어야합니다 (그렇지 않으면 nil이 속성에 대해 반환 됨).


67
이것은 나를 위해 일한 :[button.imageView setContentMode:UIViewContentModeScaleAspectFit];
ayreguitar

2
이것은 나에게도 작동하지만 adjustsImageWhenHighlighted = YES를 설정하면 버튼을 탭할 때 이미지가 다시 늘어납니다.
cduck

1
adjustsImage의 스트레칭은 iOS 6에서 제거되었습니다.
Ben Flynn

3
iOS 8에서는 실제로 작동하지 않습니다. 원래 답변 (투명 버튼 뒤에 imageView를 배치)이 가장 잘 작동합니다.
user1416564 2015 년

3
Swift du jour :button.imageView!.contentMode = UIViewContentMode.scaleAspectFit
Nestor

57

이 방법은 저에게 매우 효과적이었습니다. :

에서 XIB 버튼과 세트를 선택 user defined runtime attributes:

  • 주요 경로 : self.imageView.contentMode
  • 유형: Number
  • 값: 1

솔루션을 더 명확하게 보려면 여기를 클릭하십시오.

열거 형을 사용할 수 없기 때문에 숫자를 사용합니다. 그러나 UIViewContentModeScaleAspectFit는 1과 같습니다.


2
이것은 또한 디자인 타임에 인터페이스 빌더의 이미지를 업데이트했습니다. 훌륭한 솔루션입니다.
George Filippakos

훌륭한 솔루션, 적은 코드 및 매력처럼 작동하는 열거 형은 콘텐츠 모드 목록 항목을 기반으로합니다.
Kross

당신은 또한 수 있도록 확장을 추가 할 수 있습니다 그것을 좀 더 쉽게 : extension UIButton { @IBInspectable var imageContentMode: Int { get {return imageView?.contentMode.rawValue ?? 0} set {imageView?.contentMode = UIViewContentMode(rawValue: newValue) ?? .scaleAspectFit} } }
Yonat

'자기'없이는 imageView.contentMode나를 위해 일했습니다!
byJeevan dec

22

Interface Builder에서이 작업을 수행하는 경우 런타임 속성 검사기를 사용하여 코드없이 직접 설정할 수 있습니다.

버튼의 키 경로를 "숫자"유형과 "1"값 (또는 원하는 모드)을 사용하여 "imageView.contentMode"로 설정합니다.

imageview.contentMode = 1


14

contentMode에 버튼의 imageView를 사용합니다. 버튼 자체가 아닙니다.

homeButton.imageView.contentMode = UIViewContentModeScaleAspectFit;
homeButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill;
homeButton.contentVerticalAlignment = UIControlContentVerticalAlignmentFill;
[homeButton setImage:[UIImage imageNamed:kPNGLogo] forState:UIControlStateNormal];

6

당신이에 이미지를 넣을 경우 UIImageView버튼 뒤에, 당신은 내장의 기능 느슨한 것 UIButton같은 클래스 adjustsImageWhenHighlightedadjustsImageWhenDisabled, 서로 다른 상태에 대한 다른 이미지를 설정하는 과정 능력 (이 자신을 일의 골치 아플없이).

우리는 이미지를 원한다면 모든 제어 상태에 대한 unstreched을 한 approuch을 사용하여 이미지를 얻을 수 있습니다 imageWithCGImage:scale:orientation다음과 같은 방법으로 :

- (UIImage *) getScaledImage:(UIImage *)img insideButton:(UIButton *)btn {

    // Check which dimension (width or height) to pay respect to and
    // calculate the scale factor
    CGFloat imgRatio = img.size.width / img.size.height, 
            btnRatio = btn.frame.size.width / btn.frame.size.height,
            scaleFactor = (imgRatio > btnRatio 
                           ? img.size.width / btn.frame.size.width
                           : img.size.height / btn.frame.size.height;

    // Create image using scale factor
    UIImage *scaledImg = [UIImage imageWithCGImage:[img CGImage]
                                             scale:scaleFactor
                                       orientation:UIImageOrientationUp];
    return scaledImg;
}

이를 구현하기 위해 다음과 같이 작성합니다.

UIImage *scaledImg = [self getScaledImage:myBtnImg insideButton:myBtn];
[myBtn setImage:scaledImg forState:UIControlStateNormal];

이렇게하면 모든 제어 상태에서 이미지가 늘어나는 것을 방지 할 수 있습니다. 그것은 나를 위해 일했지만 그렇지 않은 경우 알려주십시오!

참고 : 여기서는와 관련된 문제를 다루고 UIButton있지만 , 또는 이미지를 맞추고 싶은 것이 insideButton:있을 수도 있습니다 insideView:.


6

나는이 문제가 얼마 전에 있었다. 내가 가진 문제는이 효과를 제한된 배경 UIButton에 적용하려고했기 때문에 쉽게 조정할 수 없다는 것을 의미합니다.

트릭은 이미지로 설정 한 다음 @ayreguitar의 기술을 적용하면 문제가 해결됩니다!

UIButton *myButton = [UIButton buttonWithType:UIButtonTypeCustom];
[myButton setContentMode:UIViewContentModeScaleAspectFill];
[myButton setImage:@"myImage.png" forState:UIControlStateNormal];

4

이것은 나를 위해 일했습니다.

[button.imageView setContentMode:UIViewContentModeScaleAspectFit];

그의 의견에 대해 @ayreguitar에게 감사드립니다.


4

다음은 신속한 대체 답변입니다.

myButton.imageView?.contentMode = .ScaleAspectFit

4

몇 가지 다른 답변을 하나의 솔루션으로 결합합니다. 사용자 지정 유형으로 버튼을 만들고, 버튼의 imageView contentMode 속성을 설정하고, 버튼의 이미지를 설정합니다 (배경 이미지가 아니라 여전히 채울 수 있음).

//Objective-C:
UIImage *image = [UIImage imageNamed:"myImageName.png"];
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
[button setImage:image forState:UIControlStateNormal];
button.imageView.contentMode = UIViewContentModeScaleAspectFit;

//Swift:
let image = UIImage(named: "myImageName.png")
let button = UIButton(type: .custom)
button.imageView?.contentMode = .scaleAspectFit
button.setImage(image, for: .normal)

3
btn.imageView.contentMode = UIViewContentModeScaleAspectFit;

이 코드 스 니펫은 질문을 해결할 수 있지만 설명을 포함하면 게시물의 품질을 개선하는 데 실제로 도움이됩니다. 앞으로 독자를위한 질문에 답하고 있으며, 해당 사용자는 코드 제안 이유를 모를 수 있습니다. - 리뷰에서
Ferrybig

2

이 답변은 @WernerAltewischer의 답변을 기반으로 합니다.

내 버튼을 IBOutlet에 연결하여 코드를 실행하지 않도록하기 위해 UIButton의 클래스를 서브 클래 싱했습니다.

// .h
@interface UIButtonWithImageAspectFit : UIButton
@end

// .m
@implementation UIButtonWithImageAspectFit

- (void) awakeFromNib {
    [self.imageView setContentMode:UIViewContentModeScaleAspectFit];
}

@end



이제 xib에서 사용자 정의 버튼을 만들고 해당 이미지 (배경 이미지 아님)를 설정합니다.

UIButtonWithImageAspectFit : 이미지 생성 및 설정


그런 다음 클래스를 설정하십시오.

UIButtonWithImageAspectFit : 사용자 정의 클래스 설정

끝났습니다! 버튼의 이미지
대신에
이미지 종횡비가없는 UIButton
이제 예상대로 맞습니다.
이미지 종횡비가 맞는 UIButton


2

ios 12. 콘텐츠 정렬도 추가해야합니다.

class FitButton: UIButton {

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)


    }

    override func layoutSubviews() {
        self.imageView?.contentMode = .scaleAspectFill
        self.contentHorizontalAlignment = .fill
        self.contentVerticalAlignment = .fill
        super.layoutSubviews()


    }

}

1

이미지의 크기가 비례 적으로 조정되지 않는 문제가 있었기 때문에 수정 한 방식은 가장자리 삽입을 사용하는 것이 었습니다.

fooButton.contentEdgeInsets = UIEdgeInsetsMake(10, 15, 10, 15);

1

UIView 콘텐츠 모드는 해당 CALayer의 "콘텐츠"에 적용됩니다. 이 작품 UIImageView들 그들은 설정 때문에 CALayer해당 콘텐츠를 CGImage.

drawRect: 궁극적으로 레이어 콘텐츠로 렌더링됩니다.

사용자 지정 UIButton(내가 아는 한)에는 콘텐츠가 없습니다 (둥근 사각형 스타일 버튼은 콘텐츠를 사용하여 렌더링 될 수 있음). 버튼에는 배경 UIImageView, 이미지 UIImageView및 제목과 같은 하위보기가 있습니다 UILabel. contentMode하위 뷰를 설정 하면 원하는 작업을 수행 할 수 있지만 UIButton뷰 계층 구조를 엉망으로 만드는 것은 아닙니다.


1

변화 UIButton.imageView.contentMode는 저에게 효과가 없습니다.
이미지를 'Background'속성으로 설정하여 문제를 해결했습니다.
필요한 경우 비율 제약을 추가 할 수 있습니다.


1

이것은 다른 많은 답변과 겹치지 만 저에게 해결책은

  • 설정된 contentMode의를 UIImageView버튼에 대한 .ScaleAspectFit- 중 인터페이스 빌더의에서 "런타임 정의 사용자 속성"을 수행 할 수 있습니다. (즉 self.imageView.contentMode, 번호, 1) 또는의 UIButton서브 클래스;
  • "Autoresize Subviews"를 비활성화합니다.
  • "가장자리"를 "이미지"로 설정하고 "삽입"에 대해 적절한 "상단"및 "하단"값을 설정합니다 (나와 같이 PDF를 이미지로 사용한 경우에만 필요할 수 있음).

0

위와 같이 imageWithCGImage를 사용할 수 있습니다 (그러나 누락 된 괄호 제외).

또한 4.0이 아닌 수백만 대의 휴대폰은 해당 코드로 전혀 작동하지 않습니다.


0

[button sizeToFit] 나를 위해 일했습니다.


0

@Guillaume과 유사하게 UIButton의 하위 클래스를 Swift-File로 만들었습니다. 그런 다음 Interface Builder에서 내 사용자 정의 클래스를 설정하십시오.

인터페이스 빌더.

그리고 여기 Swift 파일 :

import UIKit

class TRAspectButton : UIButton {
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        self.imageView?.contentMode = .ScaleAspectFit
    }
}

-1

동일한 문제가 있었지만 작동하지 못했습니다 (아마도 SDK의 버그 일 수 있음).

결국 해결 방법으로 UIImageView버튼 뒤에 배치하고 원하는 옵션을 설정 한 다음 그 위에 공백 UIButton을 두었 습니다.


7
여기에 에코가 있습니까? ;-)
Dan Ray
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.