답변:
이 정확한 상황을 위해 왼쪽 패딩을 설정하는 깔끔한 작은 핵을 발견했습니다.
기본적으로의 leftView 속성 UITextField
을 원하는 패딩 크기의 빈 뷰로 설정합니다 .
UIView *paddingView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 5, 20)];
textField.leftView = paddingView;
textField.leftViewMode = UITextFieldViewModeAlways;
나를 위해 매력처럼 일했다!
에서 스위프트 3 / 스위프트 네 , 그것은 그 일을 수행 할 수 있습니다
let paddingView: UIView = UIView(frame: CGRect(x: 0, y: 0, width: 5, height: 20))
textField.leftView = paddingView
textField.leftViewMode = .always
*paddingView
여러 텍스트 필드와 함께 재사용하면 앱이 중단되고 많은 CPU를 사용하는 이유는 무엇입니까?
이 카테고리 구현을 작성하여 .m
파일 맨 위에 추가했습니다 .
@implementation UITextField (custom)
- (CGRect)textRectForBounds:(CGRect)bounds {
return CGRectMake(bounds.origin.x + 10, bounds.origin.y + 8,
bounds.size.width - 20, bounds.size.height - 16);
}
- (CGRect)editingRectForBounds:(CGRect)bounds {
return [self textRectForBounds:bounds];
}
@end
Piotr Blasiak이 제공 한 링크를 기반으로합니다. 완전히 새로운 서브 클래스를 작성하는 것이 더 단순 해 보이고 추가를 추가하는 것이 더 단순 해 보였습니다 UIView
. 여전히 텍스트 필드 내부의 패딩을 제어 할 수없는 것이없는 것 같습니다.
스위프트 4 솔루션 :
class CustomTextField: UITextField {
struct Constants {
static let sidePadding: CGFloat = 10
static let topPadding: CGFloat = 8
}
override func textRect(forBounds bounds: CGRect) -> CGRect {
return CGRect(
x: bounds.origin.x + Constants.sidePadding,
y: bounds.origin.y + Constants.topPadding,
width: bounds.size.width - Constants.sidePadding * 2,
height: bounds.size.height - Constants.topPadding * 2
)
}
override func editingRect(forBounds bounds: CGRect) -> CGRect {
return self.textRect(forBounds: bounds)
}
}
Interface Builder / Storyboard에서 삽입 값을 편집 할 수있는 Xcode> 6 용 Swift 3 버전입니다.
import UIKit
@IBDesignable
class FormTextField: UITextField {
@IBInspectable var inset: CGFloat = 0
override func textRect(forBounds bounds: CGRect) -> CGRect {
return bounds.insetBy(dx: inset, dy: inset)
}
override func editingRect(forBounds bounds: CGRect) -> CGRect {
return textRect(forBounds: bounds)
}
}
override func placeholderRectForBounds(bounds: CGRect) -> CGRect { return CGRectInset(bounds, inset, inset) }
return super.textRectForBounds(CGRectInset(bounds, inset, inset))
의 오프셋을 올바르게 처리합니다.
편집 : 여전히 iOS 11.3.1에서 작동
iOS 6에서 myTextField.leftView = paddingView;
문제가 발생합니다
이것은 문제를 해결
myTextField.layer.sublayerTransform = CATransform3DMakeTranslation(5, 0, 0)
latenitecoder 가 주석에서 CATransform3DMakeTranslation(-5, 0, 0)
언급 한대로 올바르게 정렬 된 텍스트 필드 사용
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 = UIEdgeInsetsZero;
}
return self;
}
-(id)initWithCoder:(NSCoder *)aDecoder{
self = [super initWithCoder:aDecoder];
if(self){
self.edgeInsets = UIEdgeInsetsZero;
}
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
목표 C 코드
MyTextField.h
#import <UIKit/UIKit.h>
@interface MyTextField : UITextField
@property (nonatomic) IBInspectable CGFloat padding;
@end
MyTextField.m
#import "MyTextField.h"
IB_DESIGNABLE
@implementation MyTextField
@synthesize padding;
-(CGRect)textRectForBounds:(CGRect)bounds{
return CGRectInset(bounds, padding, padding);
}
-(CGRect)editingRectForBounds:(CGRect)bounds{
return [self textRectForBounds:bounds];
}
@end
PaddingTextField.swift
import UIKit
class PaddingTextField: UITextField {
@IBInspectable var paddingLeft: CGFloat = 0
@IBInspectable var paddingRight: CGFloat = 0
override func textRectForBounds(bounds: CGRect) -> CGRect {
return CGRectMake(bounds.origin.x + paddingLeft, bounds.origin.y,
bounds.size.width - paddingLeft - paddingRight, bounds.size.height);
}
override func editingRectForBounds(bounds: CGRect) -> CGRect {
return textRectForBounds(bounds)
}}
Evil Trout의 답변을 바탕으로 여러 응용 프로그램에서 더 쉽게 사용할 수 있도록 범주를 만들려고 할 수 있습니다.
헤더 파일 :
@interface UITextField (PaddingText)
-(void) setLeftPadding:(int) paddingValue;
-(void) setRightPadding:(int) paddingValue;
@end
구현 파일 :
#import "UITextField+PaddingText.h"
@implementation UITextField (PaddingText)
-(void) setLeftPadding:(int) paddingValue
{
UIView *paddingView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, paddingValue, self.frame.size.height)];
self.leftView = paddingView;
self.leftViewMode = UITextFieldViewModeAlways;
}
-(void) setRightPadding:(int) paddingValue
{
UIView *paddingView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, paddingValue, self.frame.size.height)];
self.rightView = paddingView;
self.rightViewMode = UITextFieldViewModeAlways;
}
@end
사용 예
#import "UITextField+PaddingText.h"
[self.YourTextField setLeftPadding:20.0f];
그것이 당신을 도울 수 있기를 바랍니다.
건배
스위프트 버전 :
extension UITextField {
@IBInspectable var padding_left: CGFloat {
get {
LF.log("WARNING no getter for UITextField.padding_left")
return 0
}
set (f) {
layer.sublayerTransform = CATransform3DMakeTranslation(f, 0, 0)
}
}
}
IB에 가치를 부여 할 수 있도록
IBInspectable
런타임에 세터 코드를 적용 할 수 있으므로 단순히 숫자를 입력 Interface Builder
하면 작동합니다.
Clear Button
. 이 솔루션을 적용하면 지우기 단추가 표시되지 않습니다.
다음 과 같이 UITextField를 서브 클래스 화 하십시오 ( Swift version ).
import UIKit
class CustomTextField: UITextField {
override func textRectForBounds(bounds: CGRect) -> CGRect {
return CGRectInset(bounds, 25.0, 0)
}
override func editingRectForBounds(bounds: CGRect) -> CGRect {
return self.textRectForBounds(bounds)
}
}
이것은 양쪽 에 25.0 포인트 의 수평 패딩을 추가합니다 .
Nate의 솔루션을 기반으로했지만 leftView / rightView 속성을 사용할 때 문제가 발생하므로 왼쪽 / 오른쪽보기를 고려하기 때문에 super의 구현을 조정하는 것이 좋습니다.
- (CGRect)textRectForBounds:(CGRect)bounds {
CGRect ret = [super textRectForBounds:bounds];
ret.origin.x = ret.origin.x + 5;
ret.size.width = ret.size.width - 10;
return ret;
}
- (CGRect)editingRectForBounds:(CGRect)bounds {
return [self textRectForBounds:bounds];
}
스위프트 3의 업데이트 버전 :
@IBDesignable
class FormTextField: UITextField {
@IBInspectable var paddingLeft: CGFloat = 0
@IBInspectable var paddingRight: CGFloat = 0
override func textRect(forBounds bounds: CGRect) -> CGRect {
return CGRect(x: bounds.origin.x + paddingLeft, y: bounds.origin.y, width: bounds.size.width - paddingLeft - paddingRight, height: bounds.size.height)
}
override func editingRect(forBounds bounds: CGRect) -> CGRect {
return textRect(forBounds: bounds)
}
}
@Evil Trout의 가장 투표가 많은 답변을 바탕으로 ViewController 클래스에서 다음과 같이 사용자 정의 메소드를 만들었습니다.
- (void) modifyTextField:(UITextField *)textField
{
UIView *paddingView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 5, 20)];
textField.leftView = paddingView;
textField.leftViewMode = UITextFieldViewModeAlways;
textField.rightView = paddingView;
textField.rightViewMode = UITextFieldViewModeAlways;
[textField setBackgroundColor:[UIColor whiteColor]];
[textField setTextColor:[UIColor blackColor]];
}
이제 내부에서 해당 메소드를 호출하고 (viewDidLoad 메소드) TextFields를 해당 메소드에 보내고 오른쪽과 왼쪽에 패딩을 추가하고 다음과 같이 한 줄의 코드 만 작성하여 텍스트와 배경색을 지정할 수 있습니다.
[self modifyTextField:self.firstNameTxtFld];
이것은 iOS 7에서 완벽하게 작동했습니다! 너무 많은 뷰를 추가하면이 클래스가 약간 더 무겁게로드 될 수 있습니다. 그러나 다른 솔루션의 어려움에 대해 걱정할 때이 방법에 더 편향되어 있으며이 방법을 사용하면 더 유연합니다. ;)
Hack "Evil Trout"에 감사드립니다! (활)
이 답변의 코드 스 니펫을 Swift로 업데이트해야한다고 생각했습니다.
Swift를 사용하면 기존 클래스의 확장을 작성할 수 있으므로 그렇게 작성하십시오.
extension UITextField {
func addPaddingToTextField() {
let paddingView: UIView = UIView.init(frame: CGRectMake(0, 0, 8, 20))
self.leftView = paddingView;
self.leftViewMode = .Always;
self.rightView = paddingView;
self.rightViewMode = .Always;
self.backgroundColor = UIColor.whiteColor()
self.textColor = UIColor.blackColor()
}
}
용법:
self.firstNameTxtFld.addPaddingToTextField()
이것이 다른 누군가에게 도움이되기를 바랍니다!
건배!
SWIFT에서이를 달성하는 방법은 다음과 같습니다.
@IBOutlet weak var yourTextField: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
let paddingView = UIView(frame: CGRectMake(0, 0, 10, self.yourTextField.frame.height))
yourTextField.leftView = paddingView
yourTextField.leftViewMode = UITextFieldViewMode.Always
}
}
^ 이러한 제안은 프로그래밍 방식으로 인터페이스를 만드는 사람들에게 좋습니다.
그러나 Xcode 인터페이스 빌더를 사용하는 사람들에게는 두 가지 LAZY EASY WAYS가 있습니다.
더 쉬운 방법 : UIImageView를 텍스트 필드 뒤에 놓기
가장 쉬운 방법 :의 테두리 스타일을 간단한 검은 색 사각형 (왼쪽에서 두 번째 옵션)으로 변경 한 다음 이미지를 배경 이미지로 추가하십시오. 이미지가 정사각형보다 우선하므로 정사각형이 실제로 그려지지 않고 일반 이미지 배경에 필요한 패딩이 계속 표시됩니다.
편집 : 당신은 또한 검은 구 (IB에서 UITextBox를 선택할 때 왼쪽에서 세 번째 옵션)를 사용할 수 있으며, 가장 오른쪽의 "그래픽 구"스타일에서는 작동하지 않습니다.
누구든지 Swift 4.0
버전을 찾고 있다면 아래 extension
가 작동합니다. 그것은 모두가 Left
와 Right
패딩을 UITextField
. 실제로 IBInspectable
스토리 보드 구성을위한 것입니다 . Interface Builder / Storyboard에서 직접 값을 설정할 수 있습니다. 이것은 Swift 4.0 버전과 Xcode 9.0에서 테스트되었습니다.
Clear Button
동일한 기능을 사용 UITextField
하려면 오른쪽 패딩을 비워 두어야합니다.
import UIKit
extension UITextField {
@IBInspectable var paddingLeft: CGFloat {
get {
return leftView!.frame.size.width
}
set {
let paddingView = UIView(frame: CGRect(x: 0, y: 0, width: newValue, height: frame.size.height))
leftView = paddingView
leftViewMode = .always
}
}
@IBInspectable var paddingRight: CGFloat {
get {
return rightView!.frame.size.width
}
set {
let paddingView = UIView(frame: CGRect(x: 0, y: 0, width: newValue, height: frame.size.height))
rightView = paddingView
rightViewMode = .always
}
}
}
이를 수행하는 가장 좋은 방법은 UITextField의 하위 클래스와 .m 파일을 사용하여 클래스를 만드는 것입니다.
#import "CustomTextField.h"
#import <QuartzCore/QuartzCore.h>
@implementation CustomTextField
- (id)initWithCoder:(NSCoder*)coder
{
self = [super initWithCoder:coder];
if (self) {
//self.clipsToBounds = YES;
//[self setRightViewMode:UITextFieldViewModeUnlessEditing];
self.leftView = [[UIView alloc] initWithFrame:CGRectMake(0, 0,15,46)];
self.leftViewMode=UITextFieldViewModeAlways;
}
return self;
}
이렇게하면 스토리 보드 또는 xib로 이동하여 ID 관리자를 클릭하고 클래스 옵션에서 UITextfield를 자신의 "CustomTextField"로 바꿉니다.
참고 : 텍스트 필드에 자동 레이아웃으로 패딩을 제공하면 응용 프로그램이 실행되지 않고 빈 화면 만 표시됩니다.
스위프트 3 버전 :
class CustomTextField:UITextField{
required init?(coder aDecoder: NSCoder){
super.init(coder: aDecoder)
}
override init(frame: CGRect) {
super.init(frame: frame)
}
override func textRect(forBounds bounds: CGRect) -> CGRect {
return CGRect.init(x: bounds.origin.x + 8, y: bounds.origin.y, width: bounds.width, height: bounds.height)
}
override func editingRect(forBounds bounds: CGRect) -> CGRect {
return self.textRect(forBounds:bounds)
}
}
Nate Flink의 대답은 내가 가장 좋아하는 것이지만 오른쪽 / 왼쪽보기를 잊지 마십시오. 예를 들어 UITextField
서브 클래스 :
override func rightViewRectForBounds(bounds: CGRect) -> CGRect {
let rightViewBounds = super.rightViewRectForBounds(bounds)
return CGRectMake(CGRectGetMinX(rightViewBounds) - 10, CGRectGetMinY(rightViewBounds), CGRectGetWidth(rightViewBounds), CGRectGetHeight(rightViewBounds))
}
위의 코드에 적합한 패딩을 설정 rightView
의 UITextField
.
스위프트 3 솔루션
class CustomTextField: UITextField {
override func textRect(forBounds bounds: CGRect) -> CGRect {
return CGRect(x: bounds.origin.x + 10, y: bounds.origin.y + 8, width: bounds.size.width - 20, height: bounds.size.height - 16)
}
override func editingRect(forBounds bounds: CGRect) -> CGRect {
return self.textRect(forBounds: bounds)
}
}
당신은 카테고리를 사용할 수 있습니다. 패딩을 왼쪽과 오른쪽으로 설정
UITextField + Padding.h
@interface UITextField (Padding)
@property (nonatomic, assign) CGFloat paddingValue;
@property (nonatomic, assign) CGFloat leftPadding;
@property (nonatomic, assign) CGFloat rightPadding;
//overwrite
-(CGRect)textRectForBounds:(CGRect)bounds;
-(CGRect)editingRectForBounds:(CGRect)bounds;
@end
UITextField + Padding.m
#import "UITextField+Padding.h"
#import <objc/runtime.h>
static char TAG_LeftPaddingKey;
static char TAG_RightPaddingKey;
static char TAG_Left_RightPaddingKey;
@implementation UITextField (Padding)
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wobjc-protocol-method-implementation"
-(CGRect)textRectForBounds:(CGRect)bounds {
CGFloat offset_Left=0;
CGFloat offset_Right=0;
if (self.paddingValue>0) {
offset_Left=self.paddingValue;
offset_Right=offset_Left;
}else{
if (self.leftPadding>0){
offset_Left=self.leftPadding;
}
if (self.rightPadding>0){
offset_Right=self.rightPadding;
}
}
if (offset_Left>0||offset_Right>0) {
return CGRectMake(bounds.origin.x+ offset_Left ,bounds.origin.y ,
bounds.size.width- (offset_Left+offset_Right), bounds.size.height-2 );
}else{
return bounds;
}
}
-(CGRect)editingRectForBounds:(CGRect)bounds {
return [self textRectForBounds:bounds];
}
#pragma clang diagnostic pop
#pragma maek -setter&&getter
- (CGFloat)paddingValue
{
return [objc_getAssociatedObject(self,&TAG_Left_RightPaddingKey) floatValue];
}
-(void)setPaddingValue:(CGFloat)paddingValue
{
objc_setAssociatedObject(self, &TAG_Left_RightPaddingKey, @(paddingValue), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
-(CGFloat)leftPadding
{
return [objc_getAssociatedObject(self,&TAG_LeftPaddingKey) floatValue];
}
-(void)setLeftPadding:(CGFloat)leftPadding
{
objc_setAssociatedObject(self, &TAG_LeftPaddingKey, @(leftPadding), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
-(CGFloat)rightPadding
{
return [objc_getAssociatedObject(self,&TAG_RightPaddingKey) floatValue];
}
-(void)setRightPadding:(CGFloat)rightPadding
{
objc_setAssociatedObject(self, &TAG_RightPaddingKey, @(rightPadding), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
@end
다음과 같이 패딩을 설정할 수 있습니다 . self.phoneNumTF.paddingValue = 10.f; 또는 self.phoneNumTF.leftPadding = 10.f;
@Evil trout의 답변은 훌륭합니다. 나는이 접근법을 꽤 오랫동안 사용 해왔다. 유일하게 부족한 것은 "많은 텍스트 필드를 다루는 것"입니다. 다른 접근법을 시도했지만 작동하지 않는 것 같습니다.
패딩을 추가하기 위해 UITextField를 서브 클래스 화하는 것은 나에게 의미가 없었습니다. 그래서 모든 UITextField를 반복하여 패딩을 추가했습니다.
-(void) addPaddingToAllTextFields:(UIView*)view {
for(id currentView in [view subviews]){
if([currentView isKindOfClass:[UITextField class]]) {
// Change value of CGRectMake to fit ur need
[currentView setLeftView:[[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 20)]];
[currentView setLeftViewMode:UITextFieldViewModeAlways];
}
if([currentView respondsToSelector:@selector(subviews)]){
[textfieldarray addObjectsFromArray:[self addPaddingToAllTextFields:currentView]];
}
}
}
textfieldarray
두 번째 if
블록에 정의되어 있지 않기 때문에 두 번째 내용을 다음으로 대체 한 if
for(id subSubView in [view subviews]){[self addPaddingToAllTextFields:subSubView];}
지금까지 찾은 최고의 솔루션은 범주입니다. 그것이 왼쪽과 오른쪽에 5 포인트 패딩을 추가하는 방법입니다.
@implementation UITextField (Padding)
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wobjc-protocol-method-implementation"
- (CGRect)textRectForBounds:(CGRect)bounds {
return CGRectMake(bounds.origin.x + 5, bounds.origin.y,
bounds.size.width - 10, bounds.size.height);
}
- (CGRect)editingRectForBounds:(CGRect)bounds {
return [self textRectForBounds:bounds];
}
#pragma clang diagnostic pop
@end
#pragma는 성가신 경고를 제거하기위한 것입니다.
UITextField
패딩을 추가 할 위치 가 둘 이상인 UIView
경우 공유 할 수 없기 때문에 각 텍스트 필드에 대해 별도의 공간을 만들어야합니다 .