programing

UIButton이 iPhone에서 Aspect Fit로 이동하지 않음

bestprogram 2023. 6. 21. 22:48

UIButton이 iPhone에서 Aspect Fit로 이동하지 않음

UI 버튼이 몇 개 있습니다. IB에서는 Aspect Fit로 설정되어 있지만, 어떤 이유에서인지 항상 스트레칭을 합니다.당신이 설정해야 할 다른 것이 있습니까?저는 모든 다른 뷰 모드를 시도했지만, 작동하지 않고 모두 늘어납니다.

해결책은 다음을 설정하는 것입니다.contentMode에서.imageViewUIButton.UIButton이것이 작동하려면 사용자 지정 유형으로 생성되어야 합니다(그렇지 않으면).nil이 속성에 대해 반환됨).

이 방법은 저에게 매우 효과적이었습니다.:

Xib에서 버튼을 선택하고 설정합니다.user defined runtime attributes:

  • 경로: 키경:self.imageView.contentMode
  • 유형:Number
  • 값:1

Click here to see more clearly the solution

그곳에서는 열거형을 사용할 수 없기 때문에 우리는 번호를 사용합니다.그러나 UIViewContentModeScaleAspectFit은 1과 같습니다.

전에도 그런 문제가 있었어요.저는 제 이미지를 넣어서 해결했습니다.UIImageView서, 디에어contentMode하고, 한 사용자 정의를 입니다.UIButton그 외에도

편집: 이 답변은 구식입니다.최신 버전의 iOS에서 정답은 @Werner Altewischer의 답변을 참조하십시오.

인터페이스 작성기에서 이 작업을 수행하는 경우 런타임 특성 검사기를 사용하여 코드 없이 직접 설정할 수 있습니다.

버튼의 키 경로를 "imageView.contentMode"로 설정하고 "Number" 유형과 값은 "1"(또는 원하는 모드)로 설정합니다.

imageview.contentMode = 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에 사용자 지정 버튼을 만들고 배경 이미지가 아닌 해당 이미지를 설정합니다.

UIButtonWithImageAspectFit: create and set image


그런 다음 클래스를 설정합니다.

UIButtonWithImageAspectFit: set custom class

끝났습니다!
에 대신에.
UIButton without image aspect fit
버튼의 이미지 측면 맞춤은 예상대로입니다.
UIButton with image aspect fit

이미지의 크기가 비례적으로 조정되지 않는 문제가 있어서 수정하는 방법은 가장자리를 세트로 사용하는 것이었습니다.

fooButton.contentEdgeInsets = UIEdgeInsetsMake(10, 15, 10, 15);

UIView 컨텐츠 모드는 해당 CALayer의 "콘텐츠"에 적용됩니다.이 기능은 다음과 같습니다.UIImageView왜냐하면 그들이 설정했기 때문입니다.CALayer하는 입니다.CGImage.

drawRect:궁극적으로 계층 컨텐츠로 렌더링됩니다.

정의 »UIButton(제가 알기로는) 내용이 없습니다(원형-정형 스타일 단추는 내용을 사용하여 렌더링될 수 있습니다).과 같은 뷰가 있습니다: 버에는대하위뷰있습.UIImageView이미지UIImageView은 리고제목그제목.UILabelcontentMode할 수 , 당이원것할을수있지만것도장, ▁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로 만들었습니다.그런 다음 인터페이스 작성기에서 사용자 지정 클래스를 설정합니다.

interface builder.

여기 스위프트 파일이 있습니다.

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