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

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

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

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



답변

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

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

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

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


답변

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

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

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

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

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


답변

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 버전에서 작동합니다.


답변

몇 시간의 혼란 끝에 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];


답변

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


답변

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

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

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


답변

내 대답은 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;
}