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?

Sebastian Wramba
sumber

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
Trout Jahat
sumber
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)
    }
}
Nate Flink
sumber
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

bandejapaisa
sumber
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

Inder Kumar Rathore
sumber
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
Brody Robertson
sumber
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.

Camsoft
sumber
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

Kirit Vaghela
sumber
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

777Q
sumber
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

Paulo Miguel Almeida
sumber
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

superarts.org
sumber
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.

Thomas Clayson
sumber
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.

Raja-Penyihir
sumber
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];
}
Stoto
sumber
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)
    }
}
Beninho85
sumber
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!

Randika Vishman
sumber
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

DrPatience
sumber
5

Versi Swift 2.0:

let paddingView: UIView = UIView(frame: CGRectMake(0, 0, 5, 20))
textField.leftView = paddingView
textField.leftViewMode = UITextFieldViewMode.Always;
Phil
sumber
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.

woody121
sumber
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     
        }
    }
}  
Bhavin_m
sumber
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.

Anuj Kumar Rai
sumber
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)
    }
}
王怡飞
sumber
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.

rafalkitta
sumber
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)
 }
}
Ben Sullivan
sumber
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)
Hardik Thakkar
sumber
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;

rikiluo
sumber
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]];
        }
    }
}
Kishor Kundan
sumber
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.

Lubakis
sumber
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

Mongi Zaidi
sumber
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.

Saqib Saud
sumber
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.

pengguna1686700
sumber