UITextBorderStyleNone ile UITextField için dolgu ayarlama


399

Benim için özel bir arka plan kullanmak istedim UITextFields. Güzel UITextBorderStyleNonegörünmesi için kullanmam gerekmesi dışında bu iyi çalışıyor . Bu, metni dolgu olmadan sola yapışmaya zorlar.

UITextBorderStyleRoundedRectÖzel arka plan resmimi kullanma dışındakine benzer görünmesi için doldurmayı manuel olarak ayarlayabilir miyim ?

Yanıtlar:


837

Bu tam durum için sol dolguyu ayarlamak için düzgün bir küçük kesmek buldum.

Temel olarak, öğesinin leftView özelliğini UITextFieldistediğiniz dolgu boyutunun boş bir görünümü olacak şekilde ayarlarsınız:

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

Benim için bir cazibe gibi çalıştı!

In Swift 3 / Swift 4 , bunu yapıyormuş yapılabilir

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

1
Tabii ki, çoğunlukla aynı olan sağa dolgu gerekli dışında, tam olarak ne ihtiyacım vardı. Teşekkürler!
cg.

@Lukasz Bu cevaba, kabul edilen cevaba otomatik olarak ekledim. İlk satır. EDIT: ayy, belki ben kurtarmadım? veya düzenlemem reddedildi mi? Her iki durumda da, Vincent bir otomatik yayın ekledi, bu yüzden yay!
Eric Goldberg

1
ARC kullanarak, *paddingViewbirden fazla metin alanıyla yeniden kullanırsam uygulamam neden kilitleniyor ve çok fazla CPU kullanıyor ?
Muffin Man

3
Kötü bir çözüm, Nate Flink'in çözümüne gitsek iyi olur. Thios biri, editiong modu doldurma içermez.
Jacek Kwiecień

3
Birden çok metin alanı ile çalışmaz. Sadece çok fazla bellek tüketir ve daha sonra çöker.
kuş kafesi

177

Bu kategori uygulamasını oluşturdum ve .mdosyanın üstüne ekledim .

@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

Bağlantı sağlanan Piotr Blasiak dayanarak. Tamamen yeni bir alt sınıf oluşturmak ve daha sonra ek eklemek daha basit görünüyordu UIView. Yine de, bir metin alanındaki dolguyu kontrol edemeyen bir şey eksik gibi görünüyor.

Swift 4 çözümü:

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
Bu, kategorileri geçersiz kılma yöntemleri hakkında uyarılar atar. Onları bastırmak için bu cevaba bakınız .
pdenya

5
Bunu bir kategoride yapmamayı tercih ediyorum, ancak bunun dışında kabul edilen cevaptan daha temiz bir çözüm.
Bob Vork

2
CGRectInset () yöntemini, bunun gibi bir şey için kendi etiketinizi kullanmak yerine kullanmak daha iyidir. Biraz daha temiz görünüyor: dönüş CGRectInset (sınırlar, 10, 8);
Dennis Munsie

1
@shashwat evet, istediğiniz herhangi bir dolguyu belirtebilirsiniz
Ege Akpinar

1
Bunu 4 yıl önce eklediğimde, iOS'ta işler farklıydı ve şimdi bir alt sınıf oluşturmanın en iyisi olduğunu kabul ediyorum. Ancak, sadece piksel mesafelerinizi görsel olarak incelemek için hızlı ve kirli bir yol istiyorsanız, bunu yapacak;) Yani insanlar için oy kullanmaya devam et !!
Nate Flink

139

Arabirim Oluşturucu / Öykü Tablosundaki iç değeri düzenleyebileceğiniz Xcode> 6 için Swift 3 sürümü.

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

}

resim açıklamasını buraya girin


1
Form metin alanını benimkinde görmüyorum.
okysabeni

2
Bu satırı eklemem gerekiyoroverride func placeholderRectForBounds(bounds: CGRect) -> CGRect { return CGRectInset(bounds, inset, inset) }
Michael

2
Bu cevap ne açıklanmasına bir açıklama ya da bağlantıyı daha yararlı olacağını @IBDesignableve @IBInspectabledo nshipster de yani bu yayını
Russell Austin

1
Herhangi bir aksesuar görünümüne (UITextField'daki açık düğme işlevi gibi) güveniyorsanız, aksesuar görünümlerindeki return super.textRectForBounds(CGRectInset(bounds, inset, inset))ofseti düzgün şekilde işleyecektir.
Mike Fay

@okysabeni metin alanınızı tıklamanız ve Sınıfı FormTextField olarak değiştirmeniz gerekir
Gustavo Barbosa

77

Düzenleme: Hala iOS 11.3.1'de çalışıyor

İOS 6'da myTextField.leftView = paddingView;soruna neden oluyor

Bu sorunu çözer

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

Yorumlarda latenitecoder'ın belirttiğiCATransform3DMakeTranslation(-5, 0, 0) gibi sağa hizalanmış metin alanı kullanımı için


1
Güzel, uygulamanın tüm metin alanlarına dolgu koymak zorunda kaldım, bir UITextField kategorisi oluşturdum ve bu kodu içine koydum - (void) awakeFromNib {} ve bu benim problemimi çözdü
Teena nath Paul

Çok basit! Thx :) Nasıl birçok kez kod yazmak yerine tüm UITextField yapmak için basit bir kod yapabilirim bir sorum var?
Luai Kalkatawi

1
Diğer tüm yorumlar soldan bir UITextField doldurmak istediğinizi varsayar. Alt sınıflandırma, bazı boşluk karakterleri eklemek yerine sadece boş karakterler eklemek için çok fazla ek yüktür, ancak bu çözüm THE çözümüdür. Bir satır gelecekteki kanıtı. Metin sağa hizalanmış bir metin alanı ile çalışıyorsanız eksi değer kullanın (-5,0,0) Thanks Inder
latenitecoder

1
4 yıl sonra kendi cevabımı buldum: D, @latenitecoder Yorumunuz ne gerekiyordu. Cevabı güncelleme
Inder Kumar Rathore

1
hem sağ hem de sol dolgu istiyorum ne yapabilirim?
Mina Hanna

70

UITextField öğesine dolgu eklemek için iyi bir yaklaşım, alt sınıfı ve bir edgeInsets özelliği eklemektir. Daha sonra edgeInsets öğesini ayarlarsınız ve UITextField buna göre çizilir. Bu, özel bir leftView veya rightView setiyle de doğru şekilde çalışacaktır.

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

Bu cevap kabul edilmelidir. Ayrıca sağ ve sol görünümler için de çalışır ..
NSPratik

25

Sadece UITextField alt sınıfı şöyle:

@implementation DFTextField


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

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


@end

Bu, her iki tarafa 10 nokta yatay dolgu ekler.


21

Hedef C Kodu

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

resim açıklamasını buraya girin



20
  1. Metin alanı Özel oluşturma

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. Metin alanı sınıfınızı PaddingTextField olarak ayarlayın ve dolgularınızı istediğiniz gibi özelleştirin resim açıklamasını buraya girin resim açıklamasını buraya girin

  2. Tadını çıkar

nihai


19

Evil Trout'un cevabına dayanarak, birden fazla uygulamada kullanımını kolaylaştırmak için bir kategori oluşturmak isteyebilirsiniz.

Başlık dosyası:

@interface UITextField (PaddingText)

-(void) setLeftPadding:(int) paddingValue;

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

Uygulama dosyası:

#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

Kullanım Örneği

#import "UITextField+PaddingText.h"

[self.YourTextField setLeftPadding:20.0f];

Umarım size yardımcı olur millet

Şerefe


14

Hızlı sürüm:

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

Böylece IB'de değer atayabilirsiniz

Interface Builder'da temsil edilen IBInspectable ayarı


IBInspectableayar kodunu çalışma zamanında uygulamanıza olanak tanır, bu nedenle numaranızı girmeniz yeterlidir Interface Builder.
superarts.org

Bu, sahip olduğunuzda çalışmaz Clear Button. Bu çözümü uygularsanız silme düğmeniz görünmez.
Bhavin_m

11

Dolgu ayarlayamazsınız. Bunun yerine UIViewarka plan resminize ve UITextFieldiçine sahip bir tane var. Set UITextFieldolarak genişlik UIViewWidth-(paddingSize x 2)Benzer ve yükseklik ve noktada ayarlanır paddingSize,paddingSize.


10

Sadece şu UITextField alt sınıfı ( Swift sürümü ):

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

}

Bu, her iki tarafa 25,0 puntoluk yatay dolgu ekler .


8

Nate'in çözümünü temel aldım, ancak daha sonra leftView / rightView özelliklerini kullandığınızda sorunlara neden olduğunu buldum, bu yüzden sol / sağ görünümü hesaba katacağı için süper uygulamasını daha iyi ayarlayın.

- (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 için güncellenmiş sürüm:

@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 ile UITextField için dolgu ayarlama: Swift

@Evil Trout'un en çok oy alan cevabına dayanarak, ViewController sınıfımda aşağıdaki gibi özel bir yöntem oluşturdum:

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

Şimdi bu yöntemi (viewDidLoad yöntemi) içinde çağırabilir ve TextField'lerden herhangi birini bu yönteme gönderebilir ve hem sağ hem de sol için dolgu ekleyebilir ve aşağıdaki gibi yalnızca bir kod satırı yazarak metin ve arka plan renkleri verebilirim:

[self modifyTextField:self.firstNameTxtFld];

Bu iOS 7'de mükemmel çalıştı! Çok fazla Views eklemenin bunu biraz daha ağır bir sınıf haline getireceğini biliyorum. Ancak diğer çözümlerdeki zorluklardan endişe duyduğumda, kendimi bu yönteme daha eğilimli ve bu şekilde kullanma konusunda daha esnek buldum. ;)

Hack "Evil Alabalık" için teşekkürler! (Yay)

Bu cevap kod pasajını Swift ile güncellemem gerektiğini düşündüm:

Swift mevcut sınıflar için uzantılar yazmamıza izin verdiğinden, onu bu şekilde yazalım.

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

Kullanımı:

self.firstNameTxtFld.addPaddingToTextField()

Umarım bu başka birine yardımcı olur!
Şerefe!


5

SWIFT ile bunu nasıl başaracağınız aşağıda açıklanmıştır

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

Kaynak


5

Swift 2.0 Sürümü:

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

4

^ Bu öneriler programlı olarak bir arayüz oluşturanlar için mükemmeldir.

Ancak Xcode arayüz oluşturucusunu kullananlarımız için iki TEMEL KOLAY YOL var:

  • daha kolay: metin alanının arkasına bir UIImageView yerleştirin

  • en kolay: kenarlık stilinizi basit siyah kareye (soldan ikinci seçenek) değiştirin, ardından görüntünüzü arka plan görüntüsü olarak ekleyin. Görüntü kareden önceliklidir, bu yüzden kare gerçekte çizilmeden normal bir görüntü arka planı için gereken dolguyu almaya devam edersiniz.

EDIT: Ayrıca siyah küre kullanabilirsiniz (IB UITextBox seçerken soldan üçüncü seçenek), en sağda, "grafik küre" tarzı ile çalışmaz.


Daha kolay çözümünüz gerçekten bazı durumlarda geçerli bir seçimdir, ancak en kolay çözümünüz, bir görüntünüzün kenar piksellerinin değişken alfaya sahip olması durumunda da işe yaramaz (Apple'ın gelecekteki bir iOS sürümünde uygulamalarını değiştirebileceğinden bahsetmiyoruz).
jmdecombe

Seninle aynı fikirde değilim - bu yüzden tüm büyük harflere "tembel kolay yol" koydum. Benim için bugüne kadar iyi çalıştı.
woody121

4

Herkes Swift 4.0sürüm arıyorsanız o zaman aşağıda extensioniş. Hem Leftve Rightdolgu için vardır UITextField. Aslında IBInspectablefilm şeridi yapılandırması içindir. Değeri doğrudan Arayüz Oluşturucu / Storyboard'dan ayarlayabilirsiniz. Bu, Swift 4.0 sürümü ve Xcode 9.0'da test edilmiş koddur

Clear ButtonAynı şekilde etkinleştirmek istiyorsanız, UITextFieldSağ Dolguyu boş tutmanız gerektiğini unutmayın.

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

Bunu yapmanın en iyi yolu, UITextField alt sınıfını kullanarak ve .m dosyasında bir sınıf yapmaktır

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

 }

Bunu yaparak film şeridinize veya xib'inize gidin ve kimlik denetçisine tıklayın ve UITextfield'ı kendi "CustomTextField" sınıfınızla değiştirin.

Not: Metin alanı için otomatik mizanpajlı dolgu verirseniz, uygulamanız çalışmaz ve yalnızca boş ekran göstermez.


3

Swift 3 Sürümü:

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'in cevabı benim favorim, ancak sağ / sol görüntüleri unutma. Örneğin, UITextFieldalt sınıf için:

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

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

Yukarıdaki kod için doğru dolgu set rightViewarasında UITextField.


2

Swift 3 Çözümü

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

İşte UITextfield'de dolgu vermek için bir Swift kodu

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

ve kullanarak ara

self.txtPaddingVw(txtPin)

2

kategori kullanabilirsiniz. doldurmayı sola ve sağa ayarla

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

doldurmayı bu self.phoneNumTF.paddingValue = 10.f; veya self.phoneNumTF.leftPadding = 10.f;


1

@Evil alabalık cevabı harika. Bu yaklaşımı bir süredir kullanıyorum. Eksik olan tek şey "çok sayıda metin alanıyla uğraşmak" tır. Diğer yaklaşımları denedim ama işe yaramıyor gibi görünüyor.

Sadece bir dolgu eklemek için UITextField alt sınıflandırma benim için bir anlam ifade etmedi. Böylece, dolgu eklemek için tüm UITextFields yineledi.

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

yöntem [self addPaddingToAllTextFields: [self view]] tarafından çağrılabilir;
Kishor Kundan

Yana textfieldarrayikinci tanımlı değil ifblokta, ben ikinci içeriğini değiştirdikten sonra başarı ile bu pasajı (!) Sayesinde kullanılan ifilefor(id subSubView in [view subviews]){[self addPaddingToAllTextFields:subSubView];}
adamup

1

Brody'nin çözümü benim için mükemmeldi. Bir metin alanına yan görünümler eklemek ve ek dolgu eklemek zorunda kaldım. Bu yüzden özel UIEdgeInsets özelliğini bir UITextField alt sınıfına uygulayarak göreve başladım. Bu yeni alt sınıfı tüm projelerimde kullanacağım.


1

Şimdiye kadar bulduğum en iyi çözüm bir kategoridir. Sol ve sağa 5 puanlık bir dolgu ekliyorum:

@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 sadece can sıkıcı uyarıları kaldırmak içindir


Kategorilerde yöntem aşırı yüklemesi, aslında AppCode'da kullanılmamış olarak işaretlenmesidir. İyi fikir, ama çok güvenli değil, çünkü "Optimize etmeyi optimize et" i çalıştırdığınızda kolayca kaldırılabilir (Xcode kullanıcıları için sorun yok, ancak hepimiz sınırlı kod merkezli özellikleri biliyoruz)
Sebastian Wramba

1
Uygulamadaki tüm metin alanları için dolgu uygulayacak basit bir bummer kategorisi mi?
Ben Sinclair

@Hayır hayır sadece içe aktardığınızda geçerlidir, bir sınıf UITextField + Dolgu oluşturmanız ve dolgu ile bir metin alanınız olan viewcontroller veya sınıfta içe aktarmanız gerekir
Mongi Zaidi

@MongiZaidi: yanılıyorsun. İçe aktarılmayla ilgili olup olmadığı çalıştırılabilir dosyaya bağlanır.
Zsolt Szatmari

1
textField.layer.borderWidth = 3;

benim için dolgu olarak çalışan sınır ekleyecek.


0

Başka bir husus, UITextFielddolgu eklediğiniz birden fazla yer varsa, UIViewher metin alanı için ayrı bir tane oluşturmaktır - çünkü bunlar paylaşılamaz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.