몇 개의 UIButton이 있고 IB에서는 Aspect Fit으로 설정되어 있지만 어떤 이유로 항상 늘립니다. 설정해야 할 다른 것이 있습니까? 나는 모든 다른보기 모드를 시도했지만 작동하지 않고 모두 늘어납니다.
몇 개의 UIButton이 있고 IB에서는 Aspect Fit으로 설정되어 있지만 어떤 이유로 항상 늘립니다. 설정해야 할 다른 것이 있습니까? 나는 모든 다른보기 모드를 시도했지만 작동하지 않고 모두 늘어납니다.
답변:
나는 전에 그 문제가 있었다. 나는 내 이미지를 넣어 그것을 해결 UIImageView
하는 경우, contentMode
설정이 실제로 작동, 투명 정의를 넣어 UIButton
그 맨 위에.
편집 :이 대답은 쓸모가 없습니다. 최신 버전의 iOS에서 정답 은 @Werner Altewischer의 답변 을 참조하십시오 .
해결책은 contentMode
의 imageView
속성 을 설정하는 것 UIButton
입니다. 이 UIButton
작업을 수행하려면 사용자 지정 형식으로을 만들어야합니다 (그렇지 않으면 nil
이 속성에 대해 반환 됨).
[button.imageView setContentMode:UIViewContentModeScaleAspectFit];
button.imageView!.contentMode = UIViewContentMode.scaleAspectFit
이 방법은 저에게 매우 효과적이었습니다. :
에서 XIB 버튼과 세트를 선택 user defined runtime attributes
:
self.imageView.contentMode
Number
1
열거 형을 사용할 수 없기 때문에 숫자를 사용합니다. 그러나 UIViewContentModeScaleAspectFit는 1과 같습니다.
extension UIButton { @IBInspectable var imageContentMode: Int { get {return imageView?.contentMode.rawValue ?? 0} set {imageView?.contentMode = UIViewContentMode(rawValue: newValue) ?? .scaleAspectFit} } }
imageView.contentMode
나를 위해 일했습니다!
contentMode에 버튼의 imageView를 사용합니다. 버튼 자체가 아닙니다.
homeButton.imageView.contentMode = UIViewContentModeScaleAspectFit;
homeButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill;
homeButton.contentVerticalAlignment = UIControlContentVerticalAlignmentFill;
[homeButton setImage:[UIImage imageNamed:kPNGLogo] forState:UIControlStateNormal];
당신이에 이미지를 넣을 경우 UIImageView
버튼 뒤에, 당신은 내장의 기능 느슨한 것 UIButton
같은 클래스 adjustsImageWhenHighlighted
와 adjustsImageWhenDisabled
, 서로 다른 상태에 대한 다른 이미지를 설정하는 과정 능력 (이 자신을 일의 골치 아플없이).
우리는 이미지를 원한다면 모든 제어 상태에 대한 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:
.
나는이 문제가 얼마 전에 있었다. 내가 가진 문제는이 효과를 제한된 배경 UIButton에 적용하려고했기 때문에 쉽게 조정할 수 없다는 것을 의미합니다.
트릭은 이미지로 설정 한 다음 @ayreguitar의 기술을 적용하면 문제가 해결됩니다!
UIButton *myButton = [UIButton buttonWithType:UIButtonTypeCustom];
[myButton setContentMode:UIViewContentModeScaleAspectFill];
[myButton setImage:@"myImage.png" forState:UIControlStateNormal];
몇 가지 다른 답변을 하나의 솔루션으로 결합합니다. 사용자 지정 유형으로 버튼을 만들고, 버튼의 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)
이 답변은 @WernerAltewischer의 답변을 기반으로 합니다.
내 버튼을 IBOutlet에 연결하여 코드를 실행하지 않도록하기 위해 UIButton의 클래스를 서브 클래 싱했습니다.
// .h
@interface UIButtonWithImageAspectFit : UIButton
@end
// .m
@implementation UIButtonWithImageAspectFit
- (void) awakeFromNib {
[self.imageView setContentMode:UIViewContentModeScaleAspectFit];
}
@end
이제 xib에서 사용자 정의 버튼을 만들고 해당 이미지 (배경 이미지 아님)를 설정합니다.
그런 다음 클래스를 설정하십시오.
끝났습니다!
버튼의 이미지
대신에
이제 예상대로 맞습니다.
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()
}
}
UIView 콘텐츠 모드는 해당 CALayer의 "콘텐츠"에 적용됩니다. 이 작품 UIImageView
들 그들은 설정 때문에 CALayer
해당 콘텐츠를 CGImage
.
drawRect:
궁극적으로 레이어 콘텐츠로 렌더링됩니다.
사용자 지정 UIButton
(내가 아는 한)에는 콘텐츠가 없습니다 (둥근 사각형 스타일 버튼은 콘텐츠를 사용하여 렌더링 될 수 있음). 버튼에는 배경 UIImageView
, 이미지 UIImageView
및 제목과 같은 하위보기가 있습니다 UILabel
. contentMode
하위 뷰를 설정 하면 원하는 작업을 수행 할 수 있지만 UIButton
뷰 계층 구조를 엉망으로 만드는 것은 아닙니다.
이것은 다른 많은 답변과 겹치지 만 저에게 해결책은
contentMode
의를 UIImageView
버튼에 대한 .ScaleAspectFit
- 중 인터페이스 빌더의에서 "런타임 정의 사용자 속성"을 수행 할 수 있습니다. (즉 self.imageView.contentMode
, 번호, 1) 또는의 UIButton
서브 클래스;@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
}
}