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가 작동합니다. 그것은 모두가 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     
        }
    }
}  

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

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


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.