programing

UI 텍스트 필드에서 텍스트 들여쓰기

css3 2023. 7. 29. 08:50

UI 텍스트 필드에서 텍스트 들여쓰기

제 질문은 제목만큼이나 간단하지만, 여기 조금 더 있습니다.

배경 이미지를 설정한 UI 텍스트 필드가 있습니다.문제는 텍스트가 이미지의 가장자리이기도 한 가장자리에 매우 가깝게 포옹한다는 것입니다.배경 이미지와 텍스트가 시작되는 곳 사이에 약간의 수평 공간이 있는 텍스트 필드를 Apple 필드처럼 만들고 싶습니다.

이것은 제가 어떤 하위 수업도 하지 않고 찾은 가장 빠른 방법입니다.

UIView *spacerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
[textfield setLeftViewMode:UITextFieldViewModeAlways];
[textfield setLeftView:spacerView];

Swift에서:

let spacerView = UIView(frame:CGRect(x:0, y:0, width:10, height:10))
textField.leftViewMode = UITextFieldViewMode.Always
textField.leftView = spacerView

스위프트 5:

let spacerView = UIView(frame:CGRect(x:0, y:0, width:10, height:10))
textField.leftViewMode = .always
textField.leftView = spacerView

텍스트RectForBounds: 및 편집RectForBounds:를 하위 분류하고 재정의해야 합니다.다음은 사용자 지정 배경과 수직 및 수평 패딩이 있는 UI 텍스트 필드 하위 클래스입니다.

@interface MyUITextField : UITextField 
@property (nonatomic, assign) float verticalPadding;
@property (nonatomic, assign) float horizontalPadding;
@end

#import "MyUITextField.h"
@implementation MyUITextField
@synthesize horizontalPadding, verticalPadding;
- (CGRect)textRectForBounds:(CGRect)bounds {
    return CGRectMake(bounds.origin.x + horizontalPadding, bounds.origin.y + verticalPadding, bounds.size.width - horizontalPadding*2, bounds.size.height - verticalPadding*2);
}
- (CGRect)editingRectForBounds:(CGRect)bounds {
    return [self textRectForBounds:bounds];
}
@end

용도:

UIImage *bg = [UIImage imageNamed:@"textfield.png"];
CGRect rect = CGRectMake(0, 0, bg.size.width, bg.size.height);
MyUITextField *textfield = [[[MyUITextField alloc] initWithFrame:rect] autorelease];
textfield.verticalPadding = 10; 
textfield.horizontalPadding = 10;
[textfield setBackground:bg];
[textfield setBorderStyle:UITextBorderStyleNone];
[self.view addSubview:textfield];

UITextField에 패딩을 추가하는 좋은 방법은 UITextField를 하위 클래스로 분류하여 직사각형 메서드를 재정의하고 edgeInsets 속성을 추가하는 것입니다.그런 다음 edgeInsets를 설정하면 그에 따라 UI 텍스트 필드가 그려집니다.이 기능은 사용자 정의 왼쪽 보기 또는 오른쪽 보기 세트에서도 올바르게 작동합니다.

OSTextField.h

#import <UIKit/UIKit.h>

@interface OSTextField : UITextField

@property (nonatomic, assign) UIEdgeInsets edgeInsets;

@end

OSTextField.m

#import "OSTextField.h"

@implementation OSTextField

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

- (CGRect)textRectForBounds:(CGRect)bounds {
    return [super textRectForBounds:UIEdgeInsetsInsetRect(bounds, self.edgeInsets)];
}

- (CGRect)editingRectForBounds:(CGRect)bounds {
    return [super editingRectForBounds:UIEdgeInsetsInsetRect(bounds, self.edgeInsets)];
}

@end

스토리보드 내부에서 사용할 수 있는 멋진 작은 확장판을 만들었습니다.

public extension UITextField {
    @IBInspectable public var leftSpacer:CGFloat {
        get {
            return leftView?.frame.size.width ?? 0
        } set {
            leftViewMode = .Always
            leftView = UIView(frame: CGRect(x: 0, y: 0, width: newValue, height: frame.size.height))
        }
    }
}

나의 2센트:

class PaddedTextField : UITextField {
    var insets = UIEdgeInsets.zero
    var verticalPadding:CGFloat = 0
    var horizontalPadding:CGFloat = 0

    override func textRect(forBounds bounds: CGRect) -> CGRect {
        return CGRect(x: bounds.origin.x + insets.left, y: bounds.origin.y + insets.top, width: bounds.size.width - (insets.left + insets.right), height: bounds.size.height - (insets.top + insets.bottom));
    }

    override func editingRect(forBounds bounds: CGRect) -> CGRect {
        return textRect(forBounds: bounds)
    }
}

변환할 것을 제안합니다.UITextField아주UITextView설정 및contentInset예를 들어 10개의 공백으로 들여쓰기:

textview.contentInset=UIEdgeInsetsMake(0, 10, 0, 0);

텍스트 필드의 왼쪽 보기가 Apple 돋보기 이미지인 경우도 있습니다.그렇다면 다음과 같이 들여쓰기를 설정할 수 있습니다.

    UIView *leftView = textField.leftView;
    if (leftView && [leftView isKindOfClass:[UIImageView class]]) {
        leftView.contentMode = UIViewContentModeCenter;
        leftView.width = 20.0f;  //the space you want indented.
    }

@IBOutlets를 생성하지 않으려면 하위 클래스를 만들 수 있습니다(Swift에서 답변).

class PaddedTextField: UITextField {

  override func awakeFromNib() {
      super.awakeFromNib()

      let spacerView = UIView(frame:CGRect(x: 0, y: 0, width: 10, height: 10))
      leftViewMode = .always
      leftView = spacerView
   }
}

언급URL : https://stackoverflow.com/questions/7565645/indent-the-text-in-a-uitextfield