UIButton이 콘텐츠 모드 설정을 수신하지 않습니까?


91

firstButton은 Custom 유형의 UIButton입니다. 프로그래밍 방식으로 테이블의 각 셀에 세 개를 배치하고 있습니다.

[firstButton setImage:markImage forState:UIControlStateNormal];
[firstButton setContentMode:UIViewContentModeScaleAspectFit];
[cell.contentView addSubview:firstButton];

다른 곳에서는 clipToBounds에 알려줍니다. 내가 얻는 것은 이미지의 종횡비 렌더링이 아니라 이미지의 중앙 사각형을 자르는 것입니다. firstButton.imageView에서 mode 속성을 설정하는 것을 포함하여이 많은 방법을 시도했지만 작동하지 않는 것 같습니다.


1
아래 Chris Nolet의 솔루션을 참조하십시오. button.contentVerticalAlignment = UIControlContentVerticalAlignmentTop;
Matt

UIViewContentModeScaleAspectFit에 contentVerticalAlignment 및 contentHorizontalAlignment를 모두 설정해야 함을 보여주는 stackoverflow.com/a/28205566/481207 을 참조하십시오 .
매트

답변:


187

나는 같은 문제가 있었다. 이 질문은 조금 오래되었지만 다른 사람들 (나와 같은)이 검색 결과에 나타날 때 시간을 절약하기 위해 명확하고 정확한 답변을 제공하고 싶습니다.

약간의 검색과 실험이 필요했지만 해결책을 찾았습니다. UIButton 안에있는 "숨겨진"ImageView의 ContentMode를 설정하기 만하면됩니다.

[[firstButton imageView] setContentMode: UIViewContentModeScaleAspectFit];
[firstButton setImage:[UIImage imageNamed:imageName] forState:UIControlStateNormal];

아마도 그것이 Dan Ray가 그의 대답에서 언급 한 것이지만 나는 의심하지 않습니다.


1
아니, 아니야. 내가 정한 해결책은 UIImageView를 사용하여 이미지를 보유한 다음 그 위에 "custom"유형의 명확하고 투명한 UIButton을 사용하는 것이 었습니다.
Dan Ray

Dave, 적어도 iOS 3.2에서는 솔루션이 작동하지 않는 것 같습니다. 안타깝게도 "무료"를 클릭하면 이미지의 하이라이트를 받고 싶었 기 때문입니다. contentMode를 설정하는 곳에서 button.imageView가 nil이 아니라는 것을 확인하고 contentMode를 설정 한 후 이미지를 설정했습니다.
Jacques

2
명확히하기 위해 "작동하지 않음"은 "이미지가 내가 원하는대로 축소되지 않고 전체 해상도로 표시됨"을 의미합니다.
Jacques

Jacques, 위의 내용은 iOS 4.x에서 작동합니다. 불행히도 v3.2 대상으로 빌드 할 때 "크기가 조정되지 않음"문제를 재현 할 수 있습니다. UIButton보기의 프레임 크기를 변경하려고했지만 도움이되지 않는 것 같습니다. 으.
Dave

4
아래 Chris Nolet의 솔루션을 참조하십시오. button.contentVerticalAlignment = UIControlContentVerticalAlignmentTop;
Matt

74

UIButton의 이미지 (backgroundImage와 반대)를 처리하는 경우 UIButton 자체 또는 해당 imageView에 contentMode를 설정해도 효과가 없습니다 (다른 답변이 말 했음에도 불구하고).

대신 다음을 수행하십시오.

self.button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill;
self.button.contentVerticalAlignment = UIControlContentVerticalAlignmentFill;

또는 그에 따라 이미지 크기를 조정하십시오.

또는 UITapGestureRecognizer가 연결된 UIImageView (contentMode를 적절하게 존중 함)를 사용하거나 그 위에 투명한 UIButton을 사용하십시오.


4
이것은 iOS 7의 제 경우에는 작동하지만 다른 모든 경우에는 작동하지 않습니다.
Byte

5
contentHorizontalAlignment 및 contentVerticalAlignment를 설정하는 것이 올바른 솔루션입니다. 설명 은 stackoverflow.com/a/28205566/481207 을 참조하십시오 .
매트

1
이것은 내가 찾고 있던 대답입니다.
ninjaneer 2015

4
이 대답은 틀 렸습니다. 당신은 않는 설정해야 contentModeimageView당신이 화면 채우기 또는 적합 모든 종류의 작업을 수행하려는 경우 다른 답변이 명확 것처럼. 참조 : stackoverflow.com/a/7944316/746890 .
Chris Nolet

51

contentMode버튼 자체에를 설정하는 대신 모든 종류의 화면 채우기 또는 맞춤을 ​​위해 버튼 contentHorizontalAlignmentcontentVerticalAlignment속성 을 설정 하고 (결정적으로) contentMode버튼 을 설정 하고 싶을 imageView것입니다. 예를 들면 다음과 같습니다.

button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill;
button.contentVerticalAlignment = UIControlContentVerticalAlignmentFill;
button.imageView.contentMode = UIViewContentModeScaleAspectFit;

물론, 버튼의 이미지를 버튼 상단에 정렬하는 것과 같은 다른 작업을 수행 할 수도 있습니다. 종횡비 채우기 또는 맞춤이 필요하지 않은 경우 자체적으로 정렬을 설정할 수 있습니다.

button.contentVerticalAlignment = UIControlContentVerticalAlignmentTop;

Swift에서는 다음을 사용하고 싶을 것입니다.

button.contentHorizontalAlignment = .fill
button.contentVerticalAlignment = .fill
button.imageView?.contentMode = .scaleAspectFit

이는 자동 레이아웃이있는 최신 버전 (예 : iOS 4에서 iOS 11 이상까지)을 포함한 모든 iOS 버전에서 작동합니다.


2
Chris에게 감사합니다-내 문제를 해결했거나 오히려 contentEdgeInsets와 함께 사용하여 이미지를 상단 가장자리에서 약간 뒤로 밀었습니다.
Rob Reuss 2012

7

몇 시간의 혼란 끝에 iOS 3.2에서 작동하는 방법은 다음과 같습니다. dusker가 언급했듯이 setImage 대신 setBackgroundImage를 사용하면 나를 위해 일했습니다.

CGRect myButtonFrame = CGRectMake(0, 0, 250, 250);
UIImage *myButtonImage = [UIImage imageNamed:@"buttonImage"];

UIButton *myButton = [UIButton buttonWithType:UIButtonTypeCustom];

[myButton setBackgroundImage:myButtonImage forState:UIControlStateNormal];
[myButton setFrame: myButtonFrame];
[myButton setContentMode: UIViewContentModeScaleAspectFit];

6

대답은 원하는 모든 멋진 콘텐츠 모드 설정과 함께 UIImageView를 사용하고 그 위에 사용자 정의 버튼을 레이어하는 것입니다. 한 번에 모든 것을 할 수는 없지만 할 수없는 것 같습니다.


4

이것에 대한 해결책을 찾았습니다. 의 adjustsImageWhenHighlighted속성을 UIButton로 설정합니다 NO.

  UIButton *b = [[UIButton alloc] initWithFrame:rect];
        [b setImage:image forState:UIControlStateNormal];
        [b.imageView setContentMode:UIViewContentModeScaleAspectFill];
        [b setAdjustsImageWhenHighlighted:NO];

도움이 되었기를 바랍니다. 아래에 의견을 남겨 주시면 질문이 있으시면 연락 드리겠습니다.


이것은 완벽한 솔루션입니다.
Gaurav

작동하지 않습니다. 이것은 단순히 버튼이 강조 표시되는 것을 방지합니다.
Matt

4

내 대답은 Kuba와 비슷합니다. 프로그래밍 방식으로 이미지를 설정해야했습니다.

UIImage *image = [[UIImage alloc] initWithContentsOfFile:...];
[button setBackgroundImage:image forState:UIControlStateNormal];
button.imageView.contentMode = UIViewContentModeScaleAspectFill; //this is needed for some reason, won't work without it.
for(UIView *view in button.subviews) {
    view.contentMode = UIViewContentModeScaleAspectFill;
}

3

나를 위해 일한 유일한 솔루션 :

[button setImage:image forState:UIControlStateNormal];
button.imageView.contentMode = UIViewContentModeScaleAspectFill;
button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill;
button.contentVerticalAlignment = UIControlContentVerticalAlignmentFill;


1

setImage 대신 setBackgroundImage를 시도하십시오.


3
흠. A, 그건 멍청한 데, CONTENT에 대한 CONTENT MODE 설정을 존중해야 하죠? 그리고 B, 여전히 모드 설정을 존중하지 않는 것 같습니다. 이제 "stretch"(이 경우에는 "squeeze"에 더 가깝습니다)로 고정되어 있으며 해당 측면과 관련하여 콘텐츠 크기를 조정하지 않습니다. 비율.
Dan Ray

1

여기에 간단한 인터페이스 빌더 문제가 있다고 생각합니다. 이미지 속성을 설정 한 후 IB는 콘텐츠 모드 변경을 무시합니다.

해결책은 간단합니다. 콘텐츠 모드를 설정하고 이전에 설정 한 이미지 이름을 제거한 다음 (모든 상태, 기본값, 강조 표시 등에서 제거해야 함) 원하는 모든 상태에서 원하는 이미지 이름을 다시 입력하십시오-et voilà .


1
프로그래밍 방식으로 설정된 콘텐츠 모드도 마찬가지입니다. 콘텐츠 모드를 설정하기 전에 이미지를 설정하지 마세요
JohnPayne

0

또한 adjustsImageWhenHighlighted UIButton버튼을 눌렀을 때 이미지의 이상한 변형을 피하기 위해 속성을 살펴 보는 것이 좋습니다.


0

이것을 알아 내려고 시도하면서 시간이 지남에 따라 내 방법이 약간 해커가되었고 UIButton을 하위 클래스로 만들고 setHighlighted를 재정의했습니다.

저에게는 이미지 알파를 .5로 낮추는 것이 작동합니다. 왜냐하면 그들은 검정색 배경에 있기 때문입니다.

그러나 [super setHighlighted :] (이미지 스트레치 코드가 진행되는 것처럼 보이는 곳)를 주석 처리하는 경우에만 작동합니다.이 문제를 해결하는 올바른 방법이 아닌 것 같습니다. 그래도 잘 작동합니다. 계속 작업하면서 어떻게 유지되는지 살펴 보겠습니다.

- (void)setHighlighted:(BOOL)highlight {
    if (highlight) {
        [self.imageView setAlpha:.5];
    }  else {
        [self.imageView setAlpha:1];        
    }

//    [super setHighlighted:highlight];
}

1
기회가없는 사람이이 문제를 발견하면 위의 방법은 UIScrollView에 버튼을 놓을 때까지 정상적으로 작동하는 것처럼 보였습니다. 버튼의 강조 표시가 "고정"되어 결국 발생할 수 있다고 생각했습니다.
jankins

0

iOS 6 및 iOS 7 및 스토리 보드에서 작동하는 답변을 찾는 사람이 있다면 :

스토리 보드에서 이미지를 설정할 수 있습니다.

여기에 이미지 설명 입력

그리고:

for(UIView* testId in self.subviews) {
    if([testId isKindOfClass:[UIImageView class]])
        [testId setContentMode:UIViewContentModeScaleAspectFill];
}

0

UIButton이 레이아웃 제약 설정을 수신하지 않는 것 같으면 이미지가 버튼 크기보다 큰지 확인하십시오. 망막 해상도에는 항상 @ 2x 및 @ 3x 이미지를 사용하십시오.


0

이 두 가지 (처음에는 찾기가 매우 어렵습니다)는 UIButton 이미지를 버튼 크기에 맞게 늘립니다.

여기에 이미지 설명 입력 여기에 이미지 설명 입력

코드보다는 스토리 보드에서 설정을 시도해야합니다.

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