2011-04-15 2 views

ответ

16

Как я уже объяснил в предыдущем комментарии, лучшим решением в данном случае является расширение класса UITextField вместо того, чтобы использовать категорию, так что вы можете использовать он явно указывает на нужные текстовые поля.

#import <UIKit/UIKit.h> 

@interface MYTextField : UITextField 

@end 


@implementation MYTextField 

- (CGRect)textRectForBounds:(CGRect)bounds { 
    int margin = 10; 
    CGRect inset = CGRectMake(bounds.origin.x + margin, bounds.origin.y, bounds.size.width - margin, bounds.size.height); 
    return inset; 
} 

- (CGRect)editingRectForBounds:(CGRect)bounds { 
    int margin = 10; 
    CGRect inset = CGRectMake(bounds.origin.x + margin, bounds.origin.y, bounds.size.width - margin, bounds.size.height); 
    return inset; 
} 

@end 

Категория предназначена для добавления новых функций в существующий класс, а не для переопределения существующего метода.

+0

Один вопрос. Как я могу использовать этот новый расширенный класс из Storyboard или Interface Builder? Большое спасибо. – Ricardo

+1

Привет, Рикардо, вам нужно выбрать элемент в Storyboard или Interface Builder и отредактировать собственный класс в Identity Inspector. http://grrrab.it/5rr3xy – clopez

+0

Спасибо clopez, отлично работает сейчас! :) – Ricardo

1

Я достиг почти путем переопределения - (CGRect)textRectForBounds:(CGRect)bounds. Теперь вопрос, когда TextField переходит в режим для их левого сброса Маржа к нулю редактирования .......

@implementation UITextField(UITextFieldCatagory) 

- (CGRect)textRectForBounds:(CGRect)bounds { 
    CGRect theRect=CGRectMake(bounds.origin.x+10, bounds.origin.y, bounds.size.width-10, bounds.size.height); 
    return theRect; 


} 
+0

hi need soln ??? – iOSPawan

+0

Почему бы не bounds.origin.y - 20? –

-2

Вы можете попробовать это

TextField.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter; 
TextField.textAlignment = UITextAlignmentCenter; 
+0

Мне нужно левое поле до 10 Px – iOSPawan

42

Вы можете сделать это путем расширения UITextField класса и главенствующими два метода:

- (CGRect)textRectForBounds:(CGRect)bounds; 
- (CGRect)editingRectForBounds:(CGRect)bounds; 

Вот код:

интерфейс в MYTextField.h

@interface MYTextField : UITextField 

@end 

Его реализация в MYTextField.m

@implementation MYTextField 

static CGFloat leftMargin = 28; 

- (CGRect)textRectForBounds:(CGRect)bounds 
{ 
    bounds.origin.x += leftMargin; 

    return bounds; 
} 

- (CGRect)editingRectForBounds:(CGRect)bounds 
{ 
    bounds.origin.x += leftMargin; 

    return bounds; 
} 
@end 
+1

Спасибо, что это сработало для меня ... Но у меня есть одна проблема, что она использует это для всех текстовых полей в моем приложении. Я хочу, чтобы это было в определенном текстовом поле. помоги мне в этом. – Sabby

+0

Это ожидаемое поведение каталогов, это не решение в этом случае. Вы должны расширить UITextField и переопределить те же методы. Поэтому вместо этого используйте решение @clopez. – TwiterZX

+2

Сначала я одобрил, но затем вниз. Если вы добавите 10 px для начала координат, вам нужно вычесть _20_ px из ширины, чтобы сохранить тот же край слева и справа. Плюс методы переопределения через категорию - действительно плохой идеал-чувак, как уже отмечалось выше. –

11
UITextField * textField = [[UITextField alloc]init]; 
    [textField setDelegate:self]; 
    [textField setFrame:CGRectMake(170,112,140,25)]; 
    [textField setBorderStyle:UITextBorderStyleNone]; 
    [textField setBackgroundColor:[UIColor clearColor]]; 
    [self.View addSubview:noofChildTField]; 


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

Попробуйте этот код

+0

отлично! Спасибо! просто измените CGRectMake 5 на гораздо большее значение, если нам понадобится больший запас. –

3

Я надеялся увидеть установку в IB в инспекторе свойств, чтобы изменить это значение. Оказывается, я нечаянно установил выравнивание и стиль границы для значений, которые испортились с заполнением слева.

Вы бы не подумали, что было бы выгодно выбрать право налево и без границ, но это делает слова в основном перекрывающимися или приближающимися к краю коробки, и это выглядит неправильно.

Bad:

enter image description here

Хорошо:

enter image description here

Fixed это право для меня. Надеюсь, это тоже поможет кому-то другому.

+1

+1, заметив, что 'UITextBorderStyleRoundedRect' добавляет приятное левое дополнение к TextField, тогда как' UITextBorderStyleNone' плюс ваша собственная (прямоугольная) рамка помещает текст прямо вверх по краю. – pkamb

6

Для Swift 3:

сделать выход из UITextField, скажем usernameTextField. Затем напишите следующий код в viewDidLoad()

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

Измените width: 5 на большее значение, если требуется больше места.

+0

Это гораздо приятнее, чем подклассы ... :) – chrisoneiota

Смежные вопросы