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

자동 레이아웃을 사용하여 UIButton을 정렬하면 크기가 내용에 맞게 잘 조정됩니다.

이미지를로 설정하면 button.image고유 크기가 다시 설명됩니다.

그러나 titleEdgeInsets버튼을 조정하면 레이아웃이이를 설명하지 않고 대신 버튼 제목을 자릅니다.

버튼의 고유 너비가 삽입을 설명하도록하려면 어떻게해야합니까?

여기에 이미지 설명을 입력하십시오

편집하다:

나는 다음을 사용하고 있습니다 :

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

목표는 이미지와 텍스트를 약간 분리하는 것입니다.



답변

메서드를 재정의하거나 임의의 너비 제약 조건을 설정하지 않고도이 문제를 해결할 수 있습니다. 다음과 같이 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)


답변

음수와 양수 제목 및 내용 삽입의 조합을 사용하여 Interface Builder에서 코드를 작성하지 않고도 작동하도록 할 수 있습니다.

여기에 이미지 설명을 입력하십시오

업데이트 : Xcode 7에는 ( Right삽입) 필드 에 음수 값을 입력 할 수없는 버그가 있지만 그 옆에있는 스테퍼 컨트롤을 사용하여 값을 줄일 수 있습니다. (감사합니다 스튜어트)

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

여기에 이미지 설명을 입력하십시오


답변

intrinsicContentSizeUIView 에서 메소드를 대체하지 않는 이유는 무엇 입니까? 예를 들면 다음과 같습니다.

- (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)
    }
}

사랑 U 스위프트


답변

이 스레드는 조금 낡았지만 방금 나에게 부딪 쳤고 부정적인 삽입을 사용하여 해결할 수있었습니다. 예를 들어 원하는 패딩 값을 여기에 바꿉니다.

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

올바른 자동 레이아웃 제약 조건과 함께 이미지와 텍스트를 포함하는 자동 크기 조정 버튼이 생깁니다! desiredLeftPadding10 으로 설정하면 아래와 같습니다 .

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

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

버튼의 실제 프레임이 레이블을 포함하지 않는 것을 볼 수 있습니다 (라벨이 경계 바깥쪽으로 오른쪽으로 10 포인트 이동 되었기 때문에).


답변

대한 스위프트 3 를 기반으로 pegpeg 의 대답 :

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)

    }

}