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
버튼 자체에를 설정하는 대신 모든 종류의 화면 채우기 또는 맞춤을 위해 버튼 contentHorizontalAlignment
과 contentVerticalAlignment
속성 을 설정 하고 (결정적으로) 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;
}
나를 위해 일한 유일한 솔루션 :
[button setImage:image forState:UIControlStateNormal];
button.imageView.contentMode = UIViewContentModeScaleAspectFill;
button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill;
button.contentVerticalAlignment = UIControlContentVerticalAlignmentFill;
스위프트 3
self.firstButton.imageView?.contentMode = .scaleAspectFill
setImage 대신 setBackgroundImage를 시도하십시오.
여기에 간단한 인터페이스 빌더 문제가 있다고 생각합니다. 이미지 속성을 설정 한 후 IB는 콘텐츠 모드 변경을 무시합니다.
the solution is as simple: set the content mode, remove previously set image-names (make sure you remove it in all states, default, highlighted etc.), then re-enter the desired image-names in all desired states - et voilà.
I also advice to have a look at the adjustsImageWhenHighlighted
UIButton
property to avoid weird deformations of the image, when the button is pressed.
In trying to figure this out, my method got a bit hackier as time went on, and I wound up subclassing UIButton and overriding setHighlighted:
For me it works to just knock down the image alpha to .5, because they're on a black background.
However, it only works if I comment out [super setHighlighted:] (where it appears the image-stretchy code is going on), which just doesn't feel like the right way to solve this at all...everything seems to be working fine, though. We'll see how it holds up as I keep working on it.
- (void)setHighlighted:(BOOL)highlight {
if (highlight) {
[self.imageView setAlpha:.5];
} else {
[self.imageView setAlpha:1];
}
// [super setHighlighted:highlight];
}
If anyone looking for answer that work in iOS 6 and iOS 7 and storyboard:
You can set image in your storyboard:
And then:
for(UIView* testId in self.subviews) {
if([testId isKindOfClass:[UIImageView class]])
[testId setContentMode:UIViewContentModeScaleAspectFill];
}
If the UIButton does not seem to listen to the layout constraint settings, do check whether the images are larger than the button size. Always use the @2x and @3x images for retina resolutions.
참고URL : https://stackoverflow.com/questions/2950613/uibutton-doesnt-listen-to-content-mode-setting
'developer tip' 카테고리의 다른 글
Volley Request에서 사용자 지정 헤더를 설정하는 방법 (0) | 2020.09.06 |
---|---|
덮어 쓰지 않고 파일 복사 (0) | 2020.09.06 |
어떤 리눅스 쉘 명령이 문자열의 일부를 반환합니까? (0) | 2020.09.06 |
PHP에서 sqlite3를 활성화하는 방법은 무엇입니까? (0) | 2020.09.06 |
Azure에서 'Microsoft.SqlServer.Types'버전 10 이상을 찾을 수 없습니다. (0) | 2020.09.06 |