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 /スウィフト4は、それがあることをすることによって行うことができます

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
これは悪い解決策です。NateFlinkの解決策をお勧めします。Thios 1にはeditiongモードのパディングは含まれていません。
JacekKwiecień2013

3
複数のテキストフィールドでは機能しません。非常に多くのメモリを消費し、後でクラッシュします。
鳥かご2014

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。それでも、テキストフィールド内のパディングを制御できないために何かが欠けているようです。

Swift 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

5
私はこれをカテゴリで行うことを好まないが、それ以外はこれは受け入れられた回答よりも明確な解決策である。
Bob Vork

2
このような場合は、独自にロールするのではなく、CGRectInset()を使用することをお勧めします。見た目も少しすっきりしています:return CGRectInset(bounds、10、8);
Dennis Munsie、2014年

1
@shashwatはい、必要に応じてパディングを指定できます
Ege Akpinar 14年

1
これを4年前に追加したとき、iOSでは状況が異なりましたが、今ではサブクラスを作成するのが最善であることに同意します。ただし、ピクセル距離を視覚的に検査するための速くて汚い方法が必要な場合は、これで十分です;)そのため、人々が投票し続けるのは問題ありません。
Nate Flink 2015年

139

Xcode> 6のSwift 3バージョン。InterfaceBuilder / Storyboardでインセット値を編集できます。

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 2015年

2
私はこの行を追加する必要がありましたoverride func placeholderRectForBounds(bounds: CGRect) -> CGRect { return CGRectInset(bounds, inset, inset) }
マイケル

2
この回答は、説明や、何@IBDesignable@IBInspectableして何をするかの説明へのリンク、つまりnshipsterのこの投稿
Russell Austin、

1
アクセサリビュー(UITextFieldのクリアボタン機能など)に依存している場合はreturn super.textRectForBounds(CGRectInset(bounds, inset, inset))、アクセサリビューからのオフセットを適切に処理します。
マイクフェイ

@okysabeniあなたはあなたのテキストフィールドをクリックしてClassをFormTextFieldに変更する必要があります
Gustavo Barbosa

77

編集:iOS 11.3.1でも動作します

iOS 6 myTextField.leftView = paddingView;で問題が発生しています

これは問題を解決します

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

コメントでlatenitecoderCATransform3DMakeTranslation(-5, 0, 0)言及した、右揃えのテキストフィールドの使用


1
アプリのすべてのテキストフィールドにパディングを配置する必要がありました。UITextFieldのカテゴリを作成し、このコードを-(void)awakeFromNib {}内に配置すると、問題が解決しました
Teena nath Paul

とても簡単!Thx :)何度もコードを書くのではなく、すべてのUITextFieldを作成する簡単なコードを作成するにはどうすればよいですか?
Luai Kalkatawi、2015

1
他のすべてのコメントは、UITextFieldを左から埋めたいと想定しています。サブクラス化は、空白文字を追加するのではなく、スペーシングIDを追加するための多くのオーバーヘッドですが、この解決策はその解決策です。1行の将来の証拠。テキストが右揃えのテキストフィールドで作業している場合は、マイナスの値(-5,0,0)を使用してください。ありがとうございます
latenitecoder

1
4年後、私は自分の答えを見つけました:D、@latenitecoderあなたのコメントは必要なものでした。回答の更新
Inder Kumar Rathore

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

Swiftバージョン:

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で値を割り当てることができるように

Interface Builderで表されるIBInspectable設定


IBInspectable実行時にセッターコードを適用できるため、数値を入力するだけでInterface Builder機能します。
superarts.org 2016

あなたが持っている場合、これは動作しませんClear Button。このソリューションを適用すると、クリアボタンは表示されません。
Bhavin_m 2018

11

パディングは設定できません。代わりに、UIViewあなたの背景画像とそのUITextField内部を持つを持っています。設定しUITextFieldて幅をUIViewWidth-(paddingSize x 2)、高さは、同様に、その後の時点でそれを設定しますpaddingSize,paddingSize


10

次のようにUITextFieldをサブクラス化するだけです(Swiftバージョン):

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の実装をより適切に調整します。これは、left / rightビューを考慮に入れるためです。

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

Swift 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メソッド)、任意のTextFieldをそのメソッドに送信し、右と左の両方にパディングを追加し、コードを1行だけ記述することでテキストと背景色を指定できます。

[self modifyTextField:self.firstNameTxtFld];

これはiOS 7で完全に機能しました。ビューを追加しすぎると、これがロードされるクラスが少し重くなる可能性があることを知っています。しかし、他のソリューションの難しさを気にしたとき、私はこの方法に偏りがあり、この方法を使用することでより柔軟になりました。;)

ハック「邪悪なマス」をありがとう!(弓)

私はこの回答のコードスニペットを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

Swift 2.0バージョン:

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

4

^これらの提案は、プログラムでインターフェイスを作成しているユーザーに最適です。

しかし、Xcodeインターフェースビルダーを使用する私たちには、2つのLAZY EASY WAYSがあります。

  • 簡単:UIImageViewをテキストフィールドの後ろに配置

  • 最も簡単:上のボーダースタイルをシンプルな黒い四角形(左から2番目のオプション)に変更し、画像を背景画像として追加します。画像は正方形よりも優先されるため、正方形が実際に描画されていなくても、通常の画像の背景に必要なパディングが得られます。

編集:黒い球体(IBでUITextBoxを選択するときに左から3番目のオプション)を使用することもできます。これは、右端の「グラフィックス球体」スタイルでは機能しません。


あなたのより簡単な解決策は確かにいくつかのケースで有効な選択ですが、あなたの最も簡単な解決策はハックであり、画像のエッジピクセルに可変アルファがある場合も機能しません(Appleが将来のiOSリリースで実装を変更できることは言うまでもありません)。
jmdecombe 2015

私はあなたに反対しません-それが私がすべての大文字で「怠惰な簡単な方法」を入れた理由です。これまでのところ、問題なく動作しました。
woody121 2015

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

Swift 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

ネイト・フリンクの 答えは私のお気に入りですが、右/左のビューを忘れないでください。例: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

Swift 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

@邪悪なマスの答えは素晴らしいです。私はこのアプローチをかなり長い間使用しています。それが欠けている唯一のものは、「多数のテキストフィールドを扱う」ことです。他の方法を試しましたが、うまくいかないようです。

パディングを追加するためだけに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 2013年

以来textfieldarray秒で定義されていないifブロック、私は2番目の内容を交換した後、成功とこのスニペット(!ありがとう)を使用ifしてfor(id subSubView in [view subviews]){[self addPaddingToAllTextFields:subSubView];}
adamup

1

ブロディのソリューションは私にとって完璧に機能しました。テキストフィールドにサイドビューを追加し、パディングを追加する必要がありました。したがって、カスタム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
アプリ内のすべてのテキストフィールドにパディングを適用するのは、単純な無駄なカテゴリですか?
ベンシンクレア2014年

@Andyいいえ、それをインポートする場合にのみ適用されます。UITextField+ Paddingクラスを作成し、それをビューコントローラーにインポートする必要があります。または、テキストフィールドとパディングを使用するクラス
Mongi Zaidi

@MongiZaidi:あなたは間違っている。インポートされるかどうかに関係なく、実行可能ファイルにリンクされます。
Zsolt Szatmari 2016

1
textField.layer.borderWidth = 3;

ボーダーを追加します。これは私にとってパディングとして機能しました。


0

別の考慮事項は、UITextFieldパディングを追加する場所が複数ある場合は、UIViewテキストフィールドごとに個別に作成することです。これらは共有できないためです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.