이 파티에 조금 늦었지만 추가 할만한 것이 있다고 생각합니다.
Kekoa의 답변은 훌륭하지만 RonLugge가 언급했듯이 버튼을 더 이상 존중하지 않거나 sizeToFit
더 중요하게는 본질적으로 크기가 조정 될 때 버튼이 내용을 클리핑 할 수 있습니다. 이케!
하지만 먼저
내가 믿는 방법에 대한 간략한 설명 imageEdgeInsets
과 titleEdgeInsets
일 :
에 대한 문서imageEdgeInsets
는 부분적으로 다음과 같습니다.
이 속성을 사용하여 버튼 이미지의 유효 그리기 사각형의 크기를 조정하고 위치를 조정할 수 있습니다. 4 개의 삽입 (상단, 왼쪽, 하단, 오른쪽) 각각에 대해 다른 값을 지정할 수 있습니다. 양수 값은 해당 가장자리를 줄이거 나 삽입하여 버튼 중앙에 더 가깝게 이동합니다. 음수 값은 해당 가장자리를 확장하거나 시작합니다.
이 문서는 버튼에 제목이없고 이미지 일 뿐이라고 상상하여 작성되었다고 생각합니다. 이런 식으로 생각하는 것이 훨씬 합리적이며 UIEdgeInsets
평소 처럼 행동합니다 . 기본적으로 이미지의 프레임 (또는 제목이있는 titleEdgeInsets
)은 양의 삽입으로 안쪽으로 이동하고 음의 삽입으로 바깥쪽으로 이동합니다.
그래, 뭐?
나는 거기에 도착하고있다! 기본적으로 이미지와 제목을 설정하면 다음과 같이 설정됩니다 (버튼 테두리는 녹색으로 표시되어 있습니다).
이미지와 제목 사이에 간격을 두려면 어느 쪽이든 으 깨지 말고 각 이미지와 제목에 2 개씩 4 개의 다른 삽입을 설정해야합니다. 해당 요소의 프레임 크기 를 변경하지 않고 위치 만 변경하기 때문 입니다. 이런 식으로 생각하기 시작하면 Kekoa의 우수한 범주에 필요한 변경 사항이 분명해집니다.
@implementation UIButton(ImageTitleCentering)
- (void)centerButtonAndImageWithSpacing:(CGFloat)spacing {
CGFloat insetAmount = spacing / 2.0;
self.imageEdgeInsets = UIEdgeInsetsMake(0, -insetAmount, 0, insetAmount);
self.titleEdgeInsets = UIEdgeInsetsMake(0, insetAmount, 0, -insetAmount);
}
@end
그러나 기다려라 . 내가 그렇게하면 나는 이것을 얻는다.
오 예! 나는 문서 가 이것에 대해 경고했다는 것을 잊었다 . 그들은 부분적으로 말합니다 :
이 속성은 레이아웃 중에 이미지를 배치 할 때만 사용됩니다. 버튼은이 속성을 사용하여 intrinsicContentSize
및 을 결정하지 않습니다 sizeThatFits:
.
그러나이 있다 캔 도움이 속성, 그의는 contentEdgeInsets
. 이에 대한 문서 는 부분적으로 말합니다.
버튼은 결정이 속성을 사용 intrinsicContentSize
하고 sizeThatFits:
.
그 좋은 소리. 카테고리를 다시 한 번 조정하겠습니다.
@implementation UIButton(ImageTitleCentering)
- (void)centerButtonAndImageWithSpacing:(CGFloat)spacing {
CGFloat insetAmount = spacing / 2.0;
self.imageEdgeInsets = UIEdgeInsetsMake(0, -insetAmount, 0, insetAmount);
self.titleEdgeInsets = UIEdgeInsetsMake(0, insetAmount, 0, -insetAmount);
self.contentEdgeInsets = UIEdgeInsetsMake(0, insetAmount, 0, insetAmount);
}
@end
그리고 당신은 무엇을 얻습니까?
나에게 승자처럼 보인다.
스위프트에서 일하면서 전혀 생각하고 싶지 않습니까? 다음은 Swift의 최종 확장 버전입니다.
extension UIButton {
func centerTextAndImage(spacing: CGFloat) {
let insetAmount = spacing / 2
imageEdgeInsets = UIEdgeInsets(top: 0, left: -insetAmount, bottom: 0, right: insetAmount)
titleEdgeInsets = UIEdgeInsets(top: 0, left: insetAmount, bottom: 0, right: -insetAmount)
contentEdgeInsets = UIEdgeInsets(top: 0, left: insetAmount, bottom: 0, right: insetAmount)
}
}