Program Tip

iPhone 앱에서 UIButton / UILabel '패딩'을 달성하는 방법

programtip 2020. 12. 10. 21:02
반응형

iPhone 앱에서 UIButton / UILabel '패딩'을 달성하는 방법


내 iPhone 응용 프로그램에는 패딩이 필요한 다양한보기가 있습니다. 예를 들어 텍스트가 왼쪽으로 정렬 된 사용자 정의 UIButton과 배경색이있는 UILabel이 있습니다.

이것은 정말 어리석은 질문 일 수 있지만 '패딩'을 적용하여 텍스트를 왼쪽 가장자리 밖으로 이동하려면 어떻게해야합니까?

나는 성공하지 않고 경계 등을 사용하는 데 지쳤습니다.

UILabel배경색 으로 래퍼 뷰를 만들 수 있다는 것을 알고 있지만 과도하게 보입니다.

감사합니다.


내가 사용하고 자동 레이아웃을 . 나를 위해 일한 솔루션이 설정되었다 UIButtoncontentEdgeInsets.

ObjC

button.contentEdgeInsets = UIEdgeInsetsMake(0.0f, 30.0f, 0.0f, 30.0f);

빠른

button.contentEdgeInsets = UIEdgeInsets(top: 0.0, left: 30.0, bottom: 0.0, right: 30.0)

Ok 지금까지 찾은 가장 간단한 해결책은 다음과 같습니다.

self.textAlignment = UITextAlignmentCenter; 
[self sizeToFit]; 
CGRect frame = self.frame;
frame.size.width += 20; //l + r padding 
self.frame = frame;

정확히 내가 원했던 것은 아니지만 작동합니다.


UIButton텍스트에 패딩을 설정하려면 UIButtoncontentEdgeInsets속성 을 사용해야 합니다.

스토리 보드에서 콘텐츠 삽입을 설정하려면 다음 단계를 수행하십시오.

  1. 보기 컨트롤러를 선택한 다음 UIButton
  2. 유틸리티 패널 (Command + Option + 0)로 이동하여 Attributes Inspector (Command + Option + 4)를 선택합니다.
  3. 이제 Edge 에서 콘텐츠선택 하고 요구 사항에 따라 삽입설정 합니다 (스크린 샷 참조).

여기에 이미지 설명 입력


UILabel에 패딩을 추가하는 가장 유연한 방법은 UILabel을 하위 클래스로 만들고 edgeInsets 속성을 추가하는 것입니다. 그런 다음 원하는 삽입을 설정하면 그에 따라 레이블이 그려집니다.

OSLabel.h

#import <UIKit/UIKit.h>

@interface OSLabel : UILabel

@property (nonatomic, assign) UIEdgeInsets edgeInsets;

@end

OSLabel.m

#import "OSLabel.h"

@implementation OSLabel

- (id)initWithFrame:(CGRect)frame{
    self = [super initWithFrame:frame];
    if (self) {
        self.edgeInsets = UIEdgeInsetsMake(0, 0, 0, 0);
    }
    return self;
}

-(id)initWithCoder:(NSCoder *)aDecoder{
    self = [super initWithCoder:aDecoder];
    if(self){
        self.edgeInsets = UIEdgeInsetsMake(0, 0, 0, 0);
    }
    return self;
}

- (void)drawTextInRect:(CGRect)rect {
    return [super drawTextInRect:UIEdgeInsetsInsetRect(rect, self.edgeInsets)];
}

@end

엑스 코드 (9) , 인 세트는 현재에있는 크기 경위 대신 검사기 속성의 :

Xcode 9 크기 검사기-버튼 삽입


CGRectInset 은 당신의 친구입니다. 음수 '삽입'을 설정하여 패딩을 만들 수 있습니다.

[self sizeToFit];
CGRect rect = self.frame;
rect = CGRectInset( rect, -6.f, -5.f); // h inset, v inset
self.frame = rect;

Here's a sublass of UILabel that has customizable padding using an edgeInset property:

PaddedLabel.h

#import <UIKit/UIKit.h>
@interface PaddedLabel : UILabel
@property UIEdgeInsets edgeInsets;
@end

PaddedLabel.m

#import "PaddedLabel.h"
@implementation PaddedLabel
-(void)drawTextInRect:(CGRect)rect {
    return [super drawTextInRect:UIEdgeInsetsInsetRect(rect, self.edgeInsets)];
}
-(CGSize)intrinsicContentSize {
    CGSize contentSize = [super intrinsicContentSize];
    UIEdgeInsets insets = self.edgeInsets;
    contentSize.height += insets.top + insets.bottom;
    contentSize.width += insets.left + insets.right;
    return contentSize;
}
@end

(This is a simplification of Brody's answer which also works with autolayout.)


I'm trying to achieve a similar thing, that is 'pad' a UILabel. I've been trying to implement the solution that Toby posted above, but can't seem to find where this needs to go. The UILabel I'm working with is aligned left - is that what's causing the issue?

I've tried using this in viewDidLoad, and even in a subclass of UILabel in the method:

- (CGRect)textRectForBounds:(CGRect)bounds
     limitedToNumberOfLines:(NSInteger)numberOfLines 

What about creating a custom class that extends UIButton and overriding this:

- (CGRect)titleRectForContentRect:(CGRect)contentRect
{
    return UIEdgeInsetsInsetRect(contentRect, UIEdgeInsetsMake(topPadding, rightPadding, bottomPadding, leftPadding));
}

In the case of UILabel just override:

- (CGRect)textRectForBounds:(CGRect)bounds 
     limitedToNumberOfLines:(NSInteger)numberOfLines;

If you're just looking for a horizontal padding on one line, then this may be enough (it was for me):

NSString* padding = @"  "; // 2 spaces
myLabel.text = [NSString stringWithFormat:@"%@%@%@", padding, name, padding];

참고 URL : https://stackoverflow.com/questions/3052731/how-to-achieve-uibutton-uilabel-padding-in-iphone-app

반응형