IT

자동 레이아웃 - UIButton의 고유 크기에는 제목 삽입이 포함되지 않습니다.

itgroup 2023. 4. 18. 22:30
반응형

자동 레이아웃 - UIButton의 고유 크기에는 제목 삽입이 포함되지 않습니다.

UIButton을 autolayout으로 배열하면 크기에 맞게 조정됩니다.

으로 button.imageinstrinsic size를 것

「」를 하면,titleEdgeInsets버튼의 레이아웃은 이를 고려하지 않고 버튼 제목을 잘라냅니다.

단추의 고유 너비가 삽입된 부분을 설명하려면 어떻게 해야 합니까?

여기에 이미지 설명 입력

편집:

다음을 사용하고 있습니다.

[self.backButton setTitleEdgeInsets:UIEdgeInsetsMake(0, 5, 0, 0)];

목표는 이미지와 텍스트 사이에 약간의 구분을 추가하는 것입니다.

이 기능을 인터페이스 빌더(코드를 쓰지 않고)에서 사용하려면 , 부정과 정의의 타이틀과 컨텐츠의 인셋의 편성을 사용합니다.

여기에 이미지 설명 입력

갱신하다: 할 수 Xcode 7은 마이너스 값을 입력할 수 없습니다.Right고마워 스튜어트

이렇게 하면 이미지와 제목 사이에 8pt의 간격이 추가되고 버튼의 고유 너비가 같은 양만큼 증가합니다.다음과 같이 합니다.

여기에 이미지 설명 입력

메서드를 재정의하거나 임의 너비 제한을 설정하지 않고도 이 문제를 해결할 수 있습니다.다음과 같이 Interface Builder에서 모든 작업을 수행할 수 있습니다.

  • 고유 단추 너비는 제목 너비에 아이콘 너비를 더한 왼쪽 및 오른쪽 컨텐츠 가장자리 삽입에서 파생됩니다.

  • 단추에 이미지와 텍스트가 모두 있는 경우, 단추는 그룹으로 중앙에 배치되며, 그 사이에 패딩이 없습니다.

  • 왼쪽 내용을 삽입할 경우 텍스트 + 아이콘이 아니라 텍스트에 따라 계산됩니다.

  • 음의 왼쪽 이미지를 삽입한 경우 이미지가 왼쪽으로 당겨지지만 전체 버튼 너비는 영향을 받지 않습니다.

  • 음의 왼쪽 영상을 삽입하도록 설정하면 실제 레이아웃에서 해당 값의 절반이 사용됩니다.따라서 -20 포인트 왼쪽 삽입을 얻으려면 Interface Builder에서 -40 포인트 왼쪽 삽입 값을 사용해야 합니다.

따라서 아이콘과 텍스트 사이에 원하는 왼쪽 삽입물과 안쪽 채우기를 위한 공간을 만들 수 있는 충분한 크기의 왼쪽 삽입물을 제공하고 아이콘과 텍스트 사이에서 원하는 채우기의 양을 두 배로 늘림으로써 아이콘을 왼쪽으로 이동합니다.그 결과 왼쪽과 오른쪽 콘텐츠가 동일한 단추와 텍스트와 아이콘 쌍이 그룹 중앙에 배치되고 그 사이에 특정 크기의 패딩이 있습니다.

값의 예는 다음과 같습니다.

// Produces a button with the layout:
// |-20-icon-10-text-20-|
// AutoLayout intrinsic width works as you'd desire.
button.contentEdgeInsets = UIEdgeInsetsMake(10, 30, 10, 20)
button.imageEdgeInsets = UIEdgeInsetsMake(0, -20, 0, 0)

" " " 를 입니까?intrinsicContentSize예를 들어 다음과 같습니다.

- (CGSize) intrinsicContentSize
{
    CGSize s = [super intrinsicContentSize];

    return CGSizeMake(s.width + self.titleEdgeInsets.left + self.titleEdgeInsets.right,
                      s.height + self.titleEdgeInsets.top + self.titleEdgeInsets.bottom);
}

이를 통해 자동 레이아웃 시스템에 삽입을 허용하고 전체 텍스트를 표시할 수 있도록 버튼 크기를 늘려야 한다는 것을 알 수 있습니다.저는 제 컴퓨터가 아니기 때문에 아직 테스트하지 않았습니다.

설치 방법을 지정하지 않았으므로 TitleEdgeInsets를 사용하고 있을 것으로 추측됩니다.이것은, 같은 효과를 얻을 수 있기 때문입니다.대신 contentEdgeInsets를 사용하면 정상적으로 동작합니다.

- (IBAction)ChangeTitle:(UIButton *)sender {
    self.button.contentEdgeInsets = UIEdgeInsetsMake(0,20,0,20);
    [self.button setTitle:@"Long Long Title" forState:UIControlStateNormal];
}

Swift는 다음과 같은 작업을 수행했습니다.

extension UIButton {
    override open var intrinsicContentSize: CGSize {
        let intrinsicContentSize = super.intrinsicContentSize

        let adjustedWidth = intrinsicContentSize.width + titleEdgeInsets.left + titleEdgeInsets.right
        let adjustedHeight = intrinsicContentSize.height + titleEdgeInsets.top + titleEdgeInsets.bottom

        return CGSize(width: adjustedWidth, height: adjustedHeight)
    }
}

러브 유 스위프트

이 실은 조금 낡았지만, 제가 직접 만나서 네거티브 인셋을 사용하여 해결할 수 있었습니다.예를 들어, 여기에 원하는 패딩 값을 대입합니다.

UIButton* myButton = [[UIButton alloc] init];
// setup some autolayout constraints here
myButton.titleEdgeInsets = UIEdgeInsetsMake(-desiredBottomPadding,
                                            -desiredRightPadding,
                                            -desiredTopPadding,
                                            -desiredLeftPadding);

오른쪽 자동 레이아웃 제약 조건과 결합하면 이미지와 텍스트가 포함된 자동 크기 조정 버튼이 나타납니다.에서 ''와 함께''를 참조해 주십시오.desiredLeftPadding10으로

이미지와 짧은 텍스트가 있는 버튼

이미지와 긴 텍스트가 있는 버튼

버튼의 실제 프레임은 라벨을 포함하지 않는 것을 알 수 있습니다(라벨이 오른쪽으로 10포인트 이동하기 때문에 경계 밖으로 이동). 그러나 텍스트와 그림 사이에 10포인트의 패딩을 달성했습니다.

나는 내 UIButton 아이콘과 라벨 사이에 5pt의 공간을 추가하고 싶었다.이렇게 해서 달성했습니다.

UIButton *infoButton = [UIButton buttonWithType:UIButtonTypeCustom];
// more button config etc
infoButton.contentEdgeInsets = UIEdgeInsetsMake(0, 0, 0, 5);
infoButton.titleEdgeInsets = UIEdgeInsetsMake(0, 5, 0, -5);

contentEdgeInsets, titleEdgeInsets 및 imageEdgeInsets가 서로 관련짓는 방법에는 각 inset에서 약간의 타협이 필요합니다.따라서 제목 왼쪽에 삽입물을 추가할 경우 오른쪽에 음의 삽입물을 추가하고 컨텐츠 오른쪽에 (양의 삽입물을 통해) 더 많은 공간을 제공해야 합니다.

제목 이동에 맞게 올바른 내용을 삽입하여 텍스트가 단추의 범위를 벗어나지 않도록 합니다.

pegpeg의 답변을 기반으로 한 Swift 3의 경우:

extension UIButton {

    override open var intrinsicContentSize: CGSize {

        let intrinsicContentSize = super.intrinsicContentSize

        let adjustedWidth = intrinsicContentSize.width + titleEdgeInsets.left + titleEdgeInsets.right
        let adjustedHeight = intrinsicContentSize.height + titleEdgeInsets.top + titleEdgeInsets.bottom

        return CGSize(width: adjustedWidth, height: adjustedHeight)

    }

}

위의 모든 것이 iOS 9+에서는 동작하지 않았습니다.그것은 다음과 같습니다.

  • 너비 구속조건을 추가합니다(버튼에 텍스트가 없는 경우 최소 너비).텍스트가 제공되면 버튼의 배율이 자동으로 조정됩니다.)
  • 관계를 보다 크거나 같음으로 설정하다

여기에 이미지 설명 입력

버튼 주위에 테두리를 추가하려면 다음 방법을 사용합니다.

button.contentEdgeInsets = UIEdgeInsetsMake(0,20,0,20);

이 옵션은 인터페이스 빌더에서도 사용할 수 있습니다.「Inset」를 참조해 주세요.좌우를 3으로 설정했습니다.마법처럼 작동한다.

인터페이스 빌더 스크린샷

제가 사용하는 솔루션은 버튼에 폭 제한을 추가하는 것입니다.그런 다음 초기화 시 텍스트가 설정된 후 다음과 같이 너비 구속조건을 업데이트합니다.

self.buttonWidthConstraint.constant = self.shareButton.intrinsicContentSize.width + 8;

여기서 8은 당신의 삽입물이 무엇이든 간에.

언급URL : https://stackoverflow.com/questions/17800288/autolayout-intrinsic-size-of-uibutton-does-not-include-title-insets

반응형