UITextField에서 텍스트 들여 쓰기
내 질문은 제목만큼 간단하지만 여기에 조금 더 있습니다.
배경 이미지를 설정 한 UITextField가 있습니다. 문제는 텍스트가 이미지의 가장자리이기도 한 가장자리에 너무 가깝게 포옹한다는 것입니다. 배경 이미지와 텍스트가 시작되는 위치 사이에 약간의 수평 공간이있는 내 텍스트 필드가 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
textRectForBounds : 및 editingRectForBounds :를 서브 클래스하고 재정의해야합니다. 다음은 사용자 정의 배경과 수직 및 수평 패딩이있는 UITextfield 하위 클래스입니다.
@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를 설정하면 그에 따라 UITextField가 그려집니다. 이것은 또한 사용자 정의 leftView 또는 rightView 세트로 올바르게 작동합니다.
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
나는 이것을 Storyboards 내에서 사용하기위한 멋진 작은 확장으로 바꿨습니다.
public extension UITextField {
@IBInspectable public var leftSpacer:CGFloat {
get {
if let l = leftView {
return l.frame.size.width
} else {
return 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
을 a 로 변환 UITextView
하고 contentInset
. 예를 들어 10 칸 들여 쓰기 :
textview.contentInset=UIEdgeInsetsMake(0, 10, 0, 0);
때때로 textField의 leftView는 Apple의 돋보기 이미지입니다. 그렇다면 다음과 같이 들여 쓰기를 설정할 수 있습니다.
UIView *leftView = textField.leftView;
if (leftView && [leftView isKindOfClass:[UIImageView class]]) {
leftView.contentMode = UIViewContentModeCenter;
leftView.width = 20.0f; //the space you want indented.
}
@IBOutlet을 만들고 싶지 않다면 간단히 하위 클래스를 만들 수 있습니다 (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
'developer tip' 카테고리의 다른 글
emacs는 3 개의 짝수 창으로 분할됩니다. (0) | 2020.10.15 |
---|---|
프로그래밍 방식으로 UIView의 고정 높이 제약 조건을 업데이트하는 방법은 무엇입니까? (0) | 2020.10.15 |
Rails : 마지막에 null이있는 주문 (0) | 2020.10.15 |
탐색 창에서 메뉴 항목의 텍스트 색상 변경 (0) | 2020.10.15 |
전 처리기 지시문에서 ## (이중 해시)는 무엇을합니까? (0) | 2020.10.14 |