UITextBorderStyleNone으로 UITextField의 패딩 설정


399

에 대한 사용자 지정 배경을 사용하고 싶었습니다 UITextFields. UITextBorderStyleNone예쁘게 보이기 위해 사용해야한다는 것을 제외하고는 잘 작동합니다 . 이것은 패딩없이 텍스트를 왼쪽에 붙입니다.

UITextBorderStyleRoundedRect사용자 정의 배경 이미지를 사용 하는 것을 제외하고 패딩을 수동으로 설정할 수 있습니까 ?

답변:


837

이 정확한 상황을 위해 왼쪽 패딩을 설정하는 깔끔한 작은 핵을 발견했습니다.

기본적으로의 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

1
물론 필연적으로 오른쪽에 패딩이 필요한 것을 제외하고는 내가 필요한 것입니다. 감사!
cg.

@Lukasz이 답변에 자동 릴리스를 추가했습니다. 첫 줄. 편집 : 죄송합니다, 어쩌면 내가 저장하지 않았습니까? 또는 내 편집이 거부 되었습니까? 어느 쪽이든, Vincent는 자동 릴리스를 추가했습니다.
Eric Goldberg

1
ARC를 사용하면 *paddingView여러 텍스트 필드와 함께 재사용하면 앱이 중단되고 많은 CPU를 사용하는 이유는 무엇입니까?
머핀 맨

3
나쁜 해결책입니다 .Nate Flink의 것이 좋습니다. Thios one에는 editiong 모드 패딩이 포함되어 있지 않습니다.
Jacek Kwiecień

3
여러 텍스트 필드에서 작동하지 않습니다. 너무 많은 메모리를 소비하고 나중에 충돌합니다.
birdcage

177

이 카테고리 구현을 작성하여 .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)
    }
}

6
메소드를 대체하는 카테고리에 대한 경고가 발생합니다. 억제하려면 이 답변 을 참조하십시오 .
pdenya 2016 년

5
나는 이것을 카테고리에서하지 않는 것을 선호하지만, 이것이 허용되는 대답보다 깨끗한 해결책이라는 것 외에는.
밥 보크

2
자신의 롤링 대신 CGRectInset ()을 사용하는 것이 좋습니다. 좀 더 깔끔하게 보입니다. return CGRectInset (bounds, 10, 8);
Dennis Munsie

1
@shashwat 네, 원하는 패딩을 지정할 수 있습니다
Ege Akpinar

1
이 4 년 전에 추가했을 때, iOS와는 다른 점이 있었으므로 이제 서브 클래스를 만드는 것이 가장 좋습니다. 그러나 픽셀 거리를 시각적으로 검사하는 빠르고 더러운 방법을 원한다면 그렇게 할 것입니다.) 사람들이 투표를 계속하면 좋습니다!
Nate Flink

139

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)
    }

}

여기에 이미지 설명을 입력하십시오


1
내 양식 텍스트 필드가 보이지 않습니다.
okysabeni

2
이 줄을 추가해야했습니다override func placeholderRectForBounds(bounds: CGRect) -> CGRect { return CGRectInset(bounds, inset, inset) }
Michael

2
이 답변은 무엇을의 설명에 대한 설명 또는 링크에 더 도움이 될 것입니다 @IBDesignable@IBInspectable수행 nshipster에서 즉,이 게시물
러셀 오스틴

1
UITextField의 지우기 단추 기능과 같은 액세서리보기를 사용하는 경우 액세서리보기 return super.textRectForBounds(CGRectInset(bounds, inset, inset))의 오프셋을 올바르게 처리합니다.
Mike Fay

@okysabeni 당신은 당신의 텍스트 필드를 클릭하고 클래스를 FormTextField로 변경해야합니다
Gustavo Barbosa

77

편집 : 여전히 iOS 11.3.1에서 작동

iOS 6에서 myTextField.leftView = paddingView;문제가 발생합니다

이것은 문제를 해결

myTextField.layer.sublayerTransform = CATransform3DMakeTranslation(5, 0, 0)

latenitecoder 가 주석에서 CATransform3DMakeTranslation(-5, 0, 0)언급 한대로 올바르게 정렬 된 텍스트 필드 사용


1
니스, 내가 응용 프로그램의 모든 텍스트 필드에 패딩을 넣어했다, 나는의 UITextField의 카테고리를 생성하고이 코드 안에 넣어 - (무효)로 awakeFromNib를 {}이 내 문제 해결
Teena 나스 폴

너무 간단합니다! Thx :) 코드를 여러 번 쓰는 대신 모든 UITextField를 만들기 위해 간단한 코드를 만드는 방법에 대한 질문이 있습니까?
루아이 칼 카타 위

1
다른 모든 의견은 UITextField를 왼쪽에서 채우려 고한다고 가정합니다. 서브 클래 싱은 공백 ID를 추가하는 것보다 약간의 간격 ID를 추가하는 데 많은 오버 헤드가 있지만이 솔루션은 솔루션입니다. 한 줄의 미래 증거. 당신은 인디언 자리 텍스트를 잘 정렬 사용을 뺀 값 (-5,0,0) 감사하는 텍스트 필드로 작업하는 경우
latenitecoder

1
4 년 후 나는 내 자신의 답변을 찾았습니다 : D, @latenitecoder 귀하의 의견은 필요한 것입니다. 답변 업데이트
Kumar Rathore Inder

1
오른쪽 및 왼쪽 패딩을 모두 원할 경우 어떻게해야합니까 ??
미나 한나

70

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

이 답변을 수락해야합니다. 또한 좌우 뷰에 대해서만 ..
NSPratik

25

다음과 같이 UITextField를 서브 클래스 화하십시오.

@implementation DFTextField


- (CGRect)textRectForBounds:(CGRect)bounds
{
    return CGRectInset(bounds, 10.0f, 0);
}

- (CGRect)editingRectForBounds:(CGRect)bounds
{
    return [self textRectForBounds:bounds];
}


@end

이것은 양쪽에 10 포인트의 수평 패딩을 추가합니다.


21

목표 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

여기에 이미지 설명을 입력하십시오



20
  1. 텍스트 필드 사용자 정의 만들기

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)
}}
  1. 텍스트 필드 클래스를 PaddingTextField로 설정하고 원하는대로 패딩을 사용자 정의하십시오. 여기에 이미지 설명을 입력하십시오 여기에 이미지 설명을 입력하십시오

  2. 그것을 즐기십시오

결정적인


19

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];

그것이 당신을 도울 수 있기를 바랍니다.

건배


14

스위프트 버전 :

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 설정


IBInspectable런타임에 세터 코드를 적용 할 수 있으므로 단순히 숫자를 입력 Interface Builder하면 작동합니다.
superarts.org

당신이있을 때 이것은 작동하지 않습니다 Clear Button. 이 솔루션을 적용하면 지우기 단추가 표시되지 않습니다.
Bhavin_m

11

패딩을 설정할 수 없습니다. 대신 UIView배경 이미지와 그 UITextField안에있는 이미지가 있어야 합니다. 설정 UITextField으로 폭 UIViewWidth-(paddingSize x 2)유사과 높이를 다음 지점으로 설정 paddingSize,paddingSize.


10

다음 과 같이 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 포인트 의 수평 패딩을 추가합니다 .


8

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

6

스위프트 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)
    }
}

6

UITextBorderStyleNone을 사용하여 UITextField의 패딩 설정 : Swift

@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()

이것이 다른 누군가에게 도움이되기를 바랍니다!
건배!


5

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

자원


5

스위프트 2.0 버전 :

let paddingView: UIView = UIView(frame: CGRectMake(0, 0, 5, 20))
textField.leftView = paddingView
textField.leftViewMode = UITextFieldViewMode.Always;

4

^ 이러한 제안은 프로그래밍 방식으로 인터페이스를 만드는 사람들에게 좋습니다.

그러나 Xcode 인터페이스 빌더를 사용하는 사람들에게는 두 가지 LAZY EASY WAYS가 있습니다.

  • 더 쉬운 방법 : UIImageView를 텍스트 필드 뒤에 놓기

  • 가장 쉬운 방법 :의 테두리 스타일을 간단한 검은 색 사각형 (왼쪽에서 두 번째 옵션)으로 변경 한 다음 이미지를 배경 이미지로 추가하십시오. 이미지가 정사각형보다 우선하므로 정사각형이 실제로 그려지지 않고 일반 이미지 배경에 필요한 패딩이 계속 표시됩니다.

편집 : 당신은 또한 검은 구 (IB에서 UITextBox를 선택할 때 왼쪽에서 세 번째 옵션)를 사용할 수 있으며, 가장 오른쪽의 "그래픽 구"스타일에서는 작동하지 않습니다.


어떤 경우에는 더 쉬운 솔루션이 실제로 올바른 선택이지만, 가장 쉬운 솔루션은 해킹입니다. 이미지의 가장자리 픽셀에 가변 알파가있는 경우에도 작동하지 않습니다 (애플이 향후 iOS 릴리스에서 구현을 변경할 수 있음은 말할 것도 없습니다).
jmdecombe

나는 당신에 동의하지 않습니다-그래서 모든 대문자로 "게으른 쉬운 방법"을 넣습니다. 그것은 나를 위해 잘 작동했습니다.
woody121

4

누구든지 Swift 4.0버전을 찾고 있다면 아래 extension가 작동합니다. 그것은 모두가 LeftRight패딩을 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     
        }
    }
}  

3

이를 수행하는 가장 좋은 방법은 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

스위프트 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)
    }
}

2

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))
}

위의 코드에 적합한 패딩을 설정 rightViewUITextField.


2

스위프트 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)
 }
}

2

UITextfield에서 패딩을주는 Swift 코드는 다음과 같습니다.

 func txtPaddingVw(txt:UITextField) {
     let paddingView = UIView(frame: CGRectMake(0, 0, 10, 10))
     txt.leftViewMode = .Always
     txt.leftView = paddingView
 }

사용하여 전화

self.txtPaddingVw(txtPin)

2

당신은 카테고리를 사용할 수 있습니다. 패딩을 왼쪽과 오른쪽으로 설정

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;


1

@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]];
        }
    }
}

이 메소드는 [self addPaddingToAllTextFields : [self view]]에 의해 호출 될 수 있습니다.
Kishor Kundan

textfieldarray두 번째 if블록에 정의되어 있지 않기 때문에 두 번째 내용을 다음으로 대체 한 iffor(id subSubView in [view subviews]){[self addPaddingToAllTextFields:subSubView];}
후이

1

Brody의 솔루션은 나에게 완벽했습니다. 텍스트 필드에 측면보기를 추가하고 추가 패딩을 추가해야했습니다. 따라서 사용자 정의 UIEdgeInsets 속성을 UITextField 하위 클래스에 구현하여 작업을 수행했습니다. 모든 프로젝트에서이 새로운 서브 클래스를 사용할 것입니다.


1

지금까지 찾은 최고의 솔루션은 범주입니다. 그것이 왼쪽과 오른쪽에 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는 성가신 경고를 제거하기위한 것입니다.


카테고리에서 메소드 오버로드가있는 것은 AppCode에서 사용되지 않는 것으로 표시되며 실제로는 해당 코드가 사용되지 않는 것입니다. 좋은 아이디어이지만 "가져 오기 최적화"를 실행할 때 쉽게 제거되기 때문에 매우 안전하지는 않습니다 (Xcode 사용자에게는 문제는 없지만 우리는 제한된 코드 중심 기능을 알고 있습니다)
Sebastian Wramba

1
앱의 모든 텍스트 필드에 패딩을 적용하는 간단한 범퍼 범주입니까?
벤 싱클레어

@Andy 아니오 가져올 때만 적용됩니다. UITextField + Padding 클래스를 만들고 뷰 컨트롤러 또는 패딩이있는 텍스트 필드가있는 클래스에서 가져와야합니다.
Mongi Zaidi

@MongiZaidi : 당신은 틀렸다. 임포트 여부와 관계없이 실행 파일에 연결됩니다.
Zsolt Szatmari

1
textField.layer.borderWidth = 3;

패딩으로 작동하는 테두리를 추가합니다.


0

UITextField패딩을 추가 할 위치 가 둘 이상인 UIView경우 공유 할 수 없기 때문에 각 텍스트 필드에 대해 별도의 공간을 만들어야합니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.