UIButton이 iPhone에서 Aspect Fit로 이동하지 않음
UI 버튼이 몇 개 있습니다. IB에서는 Aspect Fit로 설정되어 있지만, 어떤 이유에서인지 항상 스트레칭을 합니다.당신이 설정해야 할 다른 것이 있습니까?저는 모든 다른 뷰 모드를 시도했지만, 작동하지 않고 모두 늘어납니다.
해결책은 다음을 설정하는 것입니다.contentMode
에서.imageView
의 UIButton
.UIButton
이것이 작동하려면 사용자 지정 유형으로 생성되어야 합니다(그렇지 않으면).nil
이 속성에 대해 반환됨).
이 방법은 저에게 매우 효과적이었습니다.:
Xib에서 버튼을 선택하고 설정합니다.user defined runtime attributes
:
- 경로: 키경:
self.imageView.contentMode
- 유형:
Number
- 값:
1
그곳에서는 열거형을 사용할 수 없기 때문에 우리는 번호를 사용합니다.그러나 UIViewContentModeScaleAspectFit은 1과 같습니다.
전에도 그런 문제가 있었어요.저는 제 이미지를 넣어서 해결했습니다.UIImageView
서, 디에어contentMode
하고, 한 사용자 정의를 입니다.UIButton
그 외에도
편집: 이 답변은 구식입니다.최신 버전의 iOS에서 정답은 @Werner Altewischer의 답변을 참조하십시오.
인터페이스 작성기에서 이 작업을 수행하는 경우 런타임 특성 검사기를 사용하여 코드 없이 직접 설정할 수 있습니다.
버튼의 키 경로를 "imageView.contentMode"로 설정하고 "Number" 유형과 값은 "1"(또는 원하는 모드)로 설정합니다.
contentMode에는 버튼의 imageView를 사용합니다.버튼 자체에는 직접적으로 없습니다.
homeButton.imageView.contentMode = UIViewContentModeScaleAspectFit;
homeButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill;
homeButton.contentVerticalAlignment = UIControlContentVerticalAlignmentFill;
[homeButton setImage:[UIImage imageNamed:kPNGLogo] forState:UIControlStateNormal];
를 약당신이미넣는를면다지이에 넣으면 됩니다.UIImageView
버튼 뒤에서, 당신은 당신의 내장된 기능을 느슨하게 할 것입니다.UIButton
,스.adjustsImageWhenHighlighted
그리고.adjustsImageWhenDisabled
물론 다양한 상태에 대해 서로 다른 이미지를 설정할 수 있습니다(스스로 이 작업을 수행하는 번거로움 없이).
모든 제어 상태에 대해 이미지를 분리하려면 한 가지 접근법은 다음을 사용하여 이미지를 얻는 것입니다.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:
또는 이미지를 맞추고 싶은 것이 무엇이든.
얼마 전에 이런 문제가 있었습니다.제가 가지고 있던 문제는 배경 UIButton에 이 효과를 적용하려고 한다는 것이었는데, 이는 제한적이기 때문에 쉽게 조정할 수 없다는 것을 의미합니다.
요령은 그것을 단지 이미지로 설정한 다음 @ayregitar의 기술을 적용하는 것이고 그것은 그것을 고칠 것입니다!
UIButton *myButton = [UIButton buttonWithType:UIButtonTypeCustom];
[myButton setContentMode:UIViewContentModeScaleAspectFill];
[myButton setImage:@"myImage.png" forState:UIControlStateNormal];
이것은 나에게 효과가 있었습니다.
[button.imageView setContentMode:UIViewContentModeScaleAspectFit];
그의 코멘트에 대해 @ay regitar에게 감사합니다.
다음은 신속한 대안입니다.
myButton.imageView?.contentMode = .ScaleAspectFit
몇 가지 다른 답변을 하나의 솔루션으로 결합합니다. 사용자 지정 유형으로 버튼을 만들고 버튼의 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)
btn.imageView.contentMode = UIViewContentModeScaleAspectFit;
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()
}
}
이 답변은 @WernerAltewischer의 답변을 기반으로 합니다.
IBOutlet에 버튼을 연결하여 코드를 실행하지 않도록 UIButton의 클래스를 하위 분류했습니다.
// .h
@interface UIButtonWithImageAspectFit : UIButton
@end
// .m
@implementation UIButtonWithImageAspectFit
- (void) awakeFromNib {
[self.imageView setContentMode:UIViewContentModeScaleAspectFit];
}
@end
이제 xib에 사용자 지정 버튼을 만들고 배경 이미지가 아닌 해당 이미지를 설정합니다.
그런 다음 클래스를 설정합니다.
끝났습니다!
에 대신에.
버튼의 이미지 측면 맞춤은 예상대로입니다.
이미지의 크기가 비례적으로 조정되지 않는 문제가 있어서 수정하는 방법은 가장자리를 세트로 사용하는 것이었습니다.
fooButton.contentEdgeInsets = UIEdgeInsetsMake(10, 15, 10, 15);
UIView 컨텐츠 모드는 해당 CALayer의 "콘텐츠"에 적용됩니다.이 기능은 다음과 같습니다.UIImageView
왜냐하면 그들이 설정했기 때문입니다.CALayer
하는 입니다.CGImage
.
drawRect:
궁극적으로 계층 컨텐츠로 렌더링됩니다.
정의 »UIButton
(제가 알기로는) 내용이 없습니다(원형-정형 스타일 단추는 내용을 사용하여 렌더링될 수 있습니다).과 같은 뷰가 있습니다: 버에는대하위뷰있습.UIImageView
이미지UIImageView
은 리고제목그제목.UILabel
contentMode
할 수 , 당이원것할을수있지만것도장, ▁the▁on▁around것view는▁but▁the장.UIButton
보기 계층 구조는 약간 노노입니다.
중UIButton.imageView.contentMode
저한테는 안 통했어요
이미지를 'Background' 속성으로 설정하여 문제를 해결했습니다.
조건은 한 경우 할 수 있습니다.
이것은 다른 많은 대답들과 겹치지만, 저를 위한 해결책은
- 을 설정합니다.
contentMode
의 시대의UIImageView
하기 위한 버튼..ScaleAspectFit
인터페이스 빌더의 "사용자 정의 런타임 속성"에서 수행할 수 있습니다.self.imageView.contentMode
1), 1) 또는에서UIButton
하위 클래스; - "하위 보기 크기 자동 지정" 사용 안 함;
- "Edge"를 "Image"로 설정하고 "Inset"에 대한 적절한 "Top" 및 "Bottom" 값을 설정합니다(나처럼 PDF를 이미지로 사용하는 경우에만 필요할 수 있음).
이미지를 사용할 수 있습니다.위에 표시된 것처럼 CGI 영상 포함(괄호가 누락된 경우 제외).
또한... 수백만 대의 비 4.0 전화기는 그 코드에서 전혀 작동하지 않을 것입니다.
[button sizeToFit]
저를 위해 일했습니다.
@Guillaume와 마찬가지로, 저는 UIButton의 하위 클래스를 Swift-File로 만들었습니다.그런 다음 인터페이스 작성기에서 사용자 지정 클래스를 설정합니다.
여기 스위프트 파일이 있습니다.
import UIKit
class TRAspectButton : UIButton {
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
self.imageView?.contentMode = .ScaleAspectFit
}
}
저도 같은 문제가 있었지만 작동하지 않았습니다(아마 SDK의 버그일 것입니다).
결국, 해결책으로, 저는 다음을 배치했습니다.UIImageView
단추 뒤에 원하는 옵션을 설정한 다음 단순히 빈칸을 놓습니다.UIButton
그 위에
언급URL : https://stackoverflow.com/questions/3460694/uibutton-wont-go-to-aspect-fit-in-iphone
'programing' 카테고리의 다른 글
Firestore 날짜/시간 스탬프를 JS 날짜()로 변환하려면 어떻게 해야 합니까? (0) | 2023.06.21 |
---|---|
Mongoose findOne 및 업데이트 여러 필드 업데이트 (0) | 2023.06.21 |
파이썬을 사용한 파이어베이스 클라우드 기능? (0) | 2023.06.21 |
목록에서 중복 제거 (0) | 2023.06.11 |
루트 상태에서 Vuex 모듈에 액세스할 수 없음 (0) | 2023.06.11 |