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
'programing' 카테고리의 다른 글
Windows의 Git Shell: 패치의 기본 문자 인코딩은 UCS-2 리틀 엔디안입니다. BOM 없이 ANSI 또는 UTF-8로 변경하는 방법은 무엇입니까? (0) | 2023.08.08 |
---|---|
열 주석이 있는 Oracle 테이블 생성 (0) | 2023.07.29 |
요소에 jQuery를 사용하는 CSS 클래스가 있는지 확인합니다. (0) | 2023.07.29 |
CSS에서 모든 하위 요소를 재귀적으로 선택 (0) | 2023.07.29 |
PDO 연결 테스트 (0) | 2023.07.29 |