자동 레이아웃을 사용하여 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의 간격이 추가되고 버튼의 고유 너비가 같은 양만큼 증가합니다. 이처럼 :
답변
intrinsicContentSize
UIView 에서 메소드를 대체하지 않는 이유는 무엇 입니까? 예를 들면 다음과 같습니다.
- (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);
올바른 자동 레이아웃 제약 조건과 함께 이미지와 텍스트를 포함하는 자동 크기 조정 버튼이 생깁니다! desiredLeftPadding
10 으로 설정하면 아래와 같습니다 .
버튼의 실제 프레임이 레이블을 포함하지 않는 것을 볼 수 있습니다 (라벨이 경계 바깥쪽으로 오른쪽으로 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)
}
}