Setel padding untuk UITextField dengan UITextBorderStyleNone


399

Saya ingin menggunakan latar belakang khusus untuk UITextFields. Ini berfungsi dengan baik kecuali kenyataan bahwa saya harus menggunakan UITextBorderStyleNoneuntuk membuatnya terlihat cantik. Ini memaksa teks untuk tetap ke kiri tanpa bantalan.

Bisakah saya mengatur padding secara manual sehingga terlihat mirip UITextBorderStyleRoundedRectkecuali untuk menggunakan gambar latar belakang khusus saya?

Jawaban:


837

Saya menemukan hack kecil yang rapi untuk mengatur padding kiri untuk situasi yang tepat ini.

Pada dasarnya, Anda mengatur properti leftView dari UITextFieldmenjadi tampilan kosong ukuran padding yang Anda inginkan:

UIView *paddingView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 5, 20)];
textField.leftView = paddingView;
textField.leftViewMode = UITextFieldViewModeAlways;

Bekerja seperti pesona bagi saya!

Di Swift 3 / Swift 4 , itu bisa dilakukan dengan melakukan itu

let paddingView: UIView = UIView(frame: CGRect(x: 0, y: 0, width: 5, height: 20))
textField.leftView = paddingView
textField.leftViewMode = .always

1
Persis apa yang saya butuhkan, kecuali saya perlu padding ke kanan yang sebagian besar sama, tentu saja. Terima kasih!
cg.

@Lukasz Saya menambahkan autorelease ke jawaban ini, jawaban yang diterima. Garis pertama. EDIT: oops, mungkin saya tidak menyimpan? atau hasil edit saya ditolak? Bagaimanapun, Vincent menambahkan autorelease, jadi yay untuk itu!
Eric Goldberg

1
Menggunakan ARC, mengapa aplikasi saya hang dan menggunakan banyak CPU jika saya menggunakan kembali *paddingViewbeberapa bidang teks?
The Muffin Man

3
Ini solusi yang buruk, lebih baik untuk Nate Flink. Ini tidak termasuk pad mode edisig.
Jacek Kwiecień

3
Ini tidak bekerja dengan beberapa bidang teks. Hanya menghabiskan banyak memori dan kemudian crash.
birdcage

177

Saya membuat implementasi kategori ini dan menambahkannya ke bagian atas .mfile.

@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

Didasarkan dari tautan yang disediakan Piotr Blasiak. Tampaknya lebih sederhana kemudian membuat subkelas yang sama sekali baru, dan juga lebih sederhana kemudian menambahkan tambahan UIView. Namun, sepertinya ada sesuatu yang hilang untuk tidak dapat mengontrol padding di dalam bidang teks.

Solusi 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
Ini melempar peringatan tentang kategori metode utama. Lihat jawaban ini untuk menekan mereka.
pdenya

5
Saya lebih suka tidak melakukan ini dalam kategori, tetapi selain itu ini adalah solusi yang lebih bersih daripada jawaban yang diterima.
Bob Vork

2
Lebih baik menggunakan CGRectInset () untuk sesuatu seperti ini, daripada menggulirkan milik Anda sendiri. Ini terlihat sedikit lebih bersih: kembalikan CGRectInset (batas, 10, 8);
Dennis Munsie

1
@shashwat ya, Anda dapat menentukan padding yang Anda inginkan
Ege Akpinar

1
Ketika saya menambahkan ini 4 tahun yang lalu, segalanya berbeda dengan iOS, dan saya setuju bahwa sekarang yang terbaik adalah membuat subkelas. Namun, jika Anda hanya ingin cara cepat dan kotor memeriksa secara visual jarak piksel Anda, ini akan melakukannya;) Jadi tidak masalah bagi orang-orang yang tetap memberikan suara !!
Nate Flink

139

Versi Swift 3 untuk Xcode> 6, di mana Anda dapat mengedit nilai inset di Interface Builder / 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)
    }

}

masukkan deskripsi gambar di sini


1
Saya tidak melihat bidang teks formulir di tambang.
okysabeni

2
Saya perlu menambahkan baris inioverride func placeholderRectForBounds(bounds: CGRect) -> CGRect { return CGRectInset(bounds, inset, inset) }
Michael

2
Jawaban ini akan lebih membantu dengan penjelasan atau tautan ke penjelasan tentang apa @IBDesignabledan @IBInspectablelakukan, yaitu posting ini di nshipster
Russell Austin

1
Jika Anda mengandalkan tampilan aksesori apa pun (seperti fungsi tombol hapus pada UITextField) maka return super.textRectForBounds(CGRectInset(bounds, inset, inset))akan menangani offset dari tampilan aksesori dengan benar.
Mike Fay

@okysabeni Anda perlu mengklik pada bidang teks Anda dan mengubah Kelas untuk FormTextField
Gustavo Barbosa

77

Sunting: Masih berfungsi di iOS 11.3.1

Di iOS 6 myTextField.leftView = paddingView;menyebabkan masalah

Ini menyelesaikan masalah

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

Untuk bidang teks yang disejajarkan, gunakan CATransform3DMakeTranslation(-5, 0, 0)seperti yang disebutkan oleh latenitecoder dalam komentar


1
Bagus, saya harus meletakkan padding di semua bidang teks aplikasi, saya membuat kategori UITextField dan memasukkan kode ini di dalam - (kosong) awakeFromNib {} dan ini menyelesaikan masalah saya
Teena nath Paul

Sangat sederhana! Thx :) Saya punya pertanyaan bagaimana saya bisa membuat kode sederhana untuk membuat semua UITextField alih-alih menulis kode berkali-kali?
Luai Kalkatawi

1
Semua komentar lain menganggap Anda ingin memasang UITextField dari kiri. Subclassing adalah banyak overhead untuk menambahkan beberapa spacing id daripada hanya menambahkan beberapa karakter kosong tetapi solusi ini adalah solusi. Satu bukti di masa depan. Jika Anda bekerja dengan bidang teks yang merupakan teks yang selaras dengan benar gunakan nilai minus (-5,0,0) Terima kasih Inder
latenitecoder

1
Setelah 4 tahun saya menemukan jawaban saya sendiri: D, @latenitecoder komentar Anda adalah apa yang dibutuhkan. Memperbarui jawabannya
Inder Kumar Rathore

1
apa yang bisa saya lakukan jika saya ingin bantalan kanan dan kiri ??
Mina Hanna

70

Pendekatan yang baik untuk menambahkan padding ke UITextField adalah dengan subkelas dan menambahkan properti edgeInsets. Anda kemudian mengatur edgeInsets dan UITextField akan ditarik sesuai. Ini juga akan berfungsi dengan benar dengan set custom leftView atau 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

Ini harus diterima jawaban. Ini juga berfungsi untuk tampilan kanan dan kiri ..
NSPratik

25

Cukup subkelas UITextField seperti ini:

@implementation DFTextField


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

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


@end

Ini menambahkan lapisan horizontal 10 titik di kedua sisi.


21

Kode C Tujuan

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

masukkan deskripsi gambar di sini



20
  1. Buat Custom bidang teks

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. Setel kelas bidang teks Anda adalah PaddingTextField dan kustomkan padding Anda seperti yang Anda inginkan masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini

  2. Bersenang senang lah

terakhir


19

Berdasarkan jawaban Trout Jahat Anda mungkin ingin membuat kategori untuk membuatnya lebih mudah digunakan di beberapa aplikasi.

File tajuk:

@interface UITextField (PaddingText)

-(void) setLeftPadding:(int) paddingValue;

-(void) setRightPadding:(int) paddingValue;
@end

File implementasi:

#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

Contoh Penggunaan

#import "UITextField+PaddingText.h"

[self.YourTextField setLeftPadding:20.0f];

Semoga ini bisa membantu kalian

Bersulang


14

Versi cepat:

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

Sehingga Anda dapat menetapkan nilai dalam IB

Pengaturan IBInspectable diwakili dalam Interface Builder


IBInspectablememungkinkan Anda untuk menerapkan kode setter saat runtime, jadi cukup masukkan nomor Anda Interface Builderdan itu akan berfungsi.
superarts.org

Ini tidak akan berfungsi ketika Anda memilikinya Clear Button. Tombol hapus Anda tidak akan terlihat jika menerapkan solusi ini.
Bhavin_m

11

Anda tidak dapat mengatur padding. Alih-alih memiliki UIViewyang memiliki gambar latar belakang Anda dan bagian UITextFielddalamnya. Atur UITextFieldlebar UIViewWidth-(paddingSize x 2)dan tingginya sama dan kemudian atur pada titik paddingSize,paddingSize.


10

Cukup subkelas UITextField seperti ini ( versi 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)
    }

}

Ini menambahkan lapisan horizontal 25.0 poin di kedua sisi.


8

Saya didasarkan pada solusi Nate, tetapi kemudian saya menemukan bahwa ini menyebabkan masalah ketika Anda menggunakan properti leftView / rightView, jadi lebih baik tune implementasi super, karena itu akan mempertimbangkan tampilan kiri / kanan.

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

Versi terbaru untuk 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

Setel padding untuk UITextField dengan UITextBorderStyleNone: Swift

Berdasarkan jawaban terbanyak @Evil Trout, saya membuat metode khusus di kelas ViewController saya, seperti yang ditunjukkan di bawah ini:

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

Sekarang saya dapat memanggil metode itu di dalam (metode viewDidLoad) dan mengirim TextFields saya ke metode itu dan menambahkan padding untuk kanan dan kiri, dan memberikan warna teks dan latar belakang dengan menulis hanya satu baris kode, sebagai berikut:

[self modifyTextField:self.firstNameTxtFld];

Ini Bekerja sempurna di iOS 7! Saya tahu bahwa menambahkan terlalu banyak Tampilan mungkin membuat kelas ini sedikit lebih berat untuk dimuat. Tetapi ketika khawatir tentang kesulitan dalam solusi lain, saya menemukan diri saya lebih bias terhadap metode ini dan lebih fleksibel dengan menggunakan cara ini. ;)

Terima kasih untuk Hack "Trout Jahat"! (busur)

Saya pikir saya harus memperbarui potongan kode jawaban ini dengan Swift:

Karena Swift memungkinkan kita untuk menulis ekstensi untuk kelas yang ada, mari kita tulis dengan cara itu.

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

Pemakaian:

self.firstNameTxtFld.addPaddingToTextField()

Semoga ini bisa membantu orang lain di luar sana!
Bersulang!


5

Inilah cara untuk mencapai ini di 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
}
}

Sumber


5

Versi Swift 2.0:

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

4

^ saran-saran ini bagus untuk mereka yang secara terprogram membuat antarmuka.

Tetapi ada dua CARA MUDAH MUDAH bagi kita yang menggunakan pembangun antarmuka Xcode:

  • lebih mudah: letakkan UIImageView di belakang bidang teks

  • termudah: ubah gaya perbatasan pada Anda menjadi kotak hitam sederhana (pilihan kedua dari kiri), lalu tambahkan gambar Anda sebagai gambar latar. Gambar diutamakan di atas persegi, sehingga Anda masih mendapatkan bantalan yang diperlukan untuk latar belakang gambar normal, tanpa persegi benar-benar digambar.

EDIT: Anda juga dapat menggunakan bola hitam (opsi ketiga dari kiri saat memilih UITextBox di IB), itu tidak bekerja dengan gaya "Grafis bola" paling kanan.


Solusi Anda yang lebih mudah memang merupakan pilihan yang valid dalam beberapa kasus, tetapi solusi termudah Anda adalah hack, yang juga tidak berfungsi jika piksel tepi gambar Anda memiliki variabel alpha (belum lagi bahwa Apple dapat mengubah implementasinya dalam rilis iOS yang akan datang).
jmdecombe

Saya tidak setuju dengan Anda - itu sebabnya saya menaruh "cara mudah malas" di semua huruf besar. Ini bekerja dengan baik bagi saya hingga saat ini.
woody121

4

Jika ada yang mencari Swift 4.0versi maka di bawah extensionini berfungsi. Ini memiliki keduanya Leftdan Rightpadding untuk UITextField. Sebenarnya itu IBInspectableuntuk konfigurasi storyboard. Anda dapat mengatur nilai langsung dari Interface Builder / Storyboard. Ini adalah kode yang diuji dalam versi Swift 4.0 dan Xcode 9.0

Perlu diingat bahwa jika Anda ingin mengaktifkan Clear Buttonyang sama UITextFieldmaka Anda harus membiarkan Right Padding kosong.

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

Cara terbaik untuk melakukan ini adalah hanya membuat kelas menggunakan subclass dari UITextField dan file .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;

 }

dengan melakukan ini, pergi ke storyboard atau xib Anda dan klik inspektur identitas dan ganti UITextfield dengan "CustomTextField" Anda sendiri di opsi kelas.

Catatan: Jika Anda memberikan padding dengan tata letak otomatis untuk bidang teks maka aplikasi Anda tidak akan berjalan dan hanya menampilkan layar kosong.


3

Versi 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

Jawaban Nate Flink adalah favorit saya, tetapi jangan lupa tentang pandangan kanan / kiri. Misalnya untuk UITextFieldsubkelas:

override func rightViewRectForBounds(bounds: CGRect) -> CGRect {
    let rightViewBounds = super.rightViewRectForBounds(bounds)

    return CGRectMake(CGRectGetMinX(rightViewBounds) - 10, CGRectGetMinY(rightViewBounds), CGRectGetWidth(rightViewBounds), CGRectGetHeight(rightViewBounds))
}

Di atas kode set bantalan tepat untuk rightViewdari UITextField.


2

Solusi 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

Berikut adalah kode Swift untuk memberikan padding di UITextfield

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

dan panggil menggunakan

self.txtPaddingVw(txtPin)

2

Anda bisa menggunakan kategori. atur padding ke kiri dan kanan

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

Anda dapat mengatur padding seperti self.phoneNumTF.paddingValue = 10.f; atau self.phoneNumTF.leftPadding = 10.f;


1

@Evil trout jawabannya bagus. Saya telah menggunakan pendekatan ini untuk beberapa waktu sekarang. Satu-satunya hal yang kurang adalah "berurusan dengan berbagai bidang teks". Saya mencoba pendekatan lain tetapi tampaknya tidak berhasil.

Subclassing UITextField hanya untuk menambahkan padding tidak masuk akal bagi saya. Jadi, saya mengulangi semua UITextFields untuk menambahkan padding.

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

metode ini dapat dipanggil oleh [self addPaddingToAllTextFields: [self view]];
Kishor Kundan

Karena textfieldarraytidak didefinisikan di ifblok kedua , saya menggunakan cuplikan ini (terima kasih!) Dengan sukses setelah mengganti konten yang kedua ifdenganfor(id subSubView in [view subviews]){[self addPaddingToAllTextFields:subSubView];}
adamup

1

Solusi Brody bekerja sempurna untuk saya. Saya harus menambahkan tampilan samping pada bidang teks dan menambahkan padding tambahan. Jadi dengan mengimplementasikan properti UIEdgeInsets kustom ke subkelas UITextField saya telah berhasil mencapai tugas. Saya akan menggunakan subkelas baru ini di semua proyek saya.


1

Solusi terbaik yang saya temukan sejauh ini adalah kategori. Begitulah cara saya menambahkan padding 5 poin ke kiri dan kanan:

@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 hanya untuk menghilangkan peringatan yang mengganggu


Masalahnya dengan metode overloading dalam kategori adalah, bahwa itu akan ditandai sebagai tidak terpakai di AppCode, yang sebenarnya. Ide bagus, tetapi tidak terlalu aman karena mudah dihapus ketika Anda menjalankan "Optimalkan impor" (meskipun tidak ada masalah bagi pengguna Xcode, tetapi kita semua tahu fitur kode-sentris terbatas)
Sebastian Wramba

1
Apakah ini adalah kategori gelandangan sederhana yang akan menerapkan padding untuk semua bidang teks di aplikasi?
Ben Sinclair

@Andy tidak, ini hanya berlaku saat Anda mengimpornya, Anda harus membuat kelas UITextField + Padding dan mengimpornya di viewcontroller atau kelas yang Anda miliki bidang teksnya dengan bantalan
Mongi Zaidi

@MongiZaidi: Anda salah. Itu akan ditautkan ke executable, apakah yang diimpor tidak relevan.
Zsolt Szatmari

1
textField.layer.borderWidth = 3;

akan menambahkan perbatasan, yang berfungsi sebagai bantalan untuk saya.


0

Pertimbangan lain adalah bahwa, jika Anda memiliki lebih dari satu UITextFieldtempat Anda menambahkan padding, adalah membuat terpisah UIViewuntuk setiap bidang teks - karena mereka tidak dapat dibagi.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.