Я хочу поместить левое поле текста UITextField
в 10 пикселей. Каков наилучший способ сделать это?
Добавить lefthand margin в UITextField
Ответ 1
Как я объяснил в предыдущем комментарии, лучшим решением в этом случае является расширение класса 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
Категория предназначена для добавления новых функций в существующий класс, а не для переопределения существующего метода.
Ответ 2
Вы можете сделать это, расширив класс 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
Ответ 3
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;
Попробуйте этот код
Ответ 4
Для 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
на большее значение, если требуется больше места.
Ответ 5
Я надеялся увидеть настройку в IB в инспекторе свойств, чтобы настроить это значение. Оказывается, я нечаянно установил выравнивание и стиль границы для значений, которые испортились с заполнением слева.
Вы бы не подумали, что было бы очень важно выбрать право налево и отсутствие границы, но это делает слова в основном перекрывающимися или приближающимися к краю окна, и это выглядит неправильно.
Плохо:
Хорошо:
Исправлено это для меня. Надеюсь, это тоже поможет кому-то другому.
Ответ 6
i достигнуто почти путем переопределения - (CGRect)textRectForBounds:(CGRect)bounds
. теперь проблема заключается в том, когда TextField переходит в режим редактирования своего левого поля reset до нуля...
@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;
}
Ответ 7
Подкласс UITextField и добавьте расширение:
extension UITextField {
func paddingLeft(inset: CGFloat){
self.leftView = UIView(frame: CGRect(x: 0, y: 0, width: inset, height: self.frame.height))
self.leftViewMode = UITextField.ViewMode.always
}
}
usage
использованияclass MyUITextFieldClass: UITextField {
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
self.paddingLeft(inset: 10)
}
}
Ответ 8
Для Swift 4:
Я предпочитаю использовать IBDesignable
и IBInspectable
чтобы позволить мне устанавливать IBInspectable
через раскадровки Xcode и сохранять ее повторно. Я также обновил код для работы в Swift 4.
import Foundation
import UIKit
@IBDesignable
class PaddableTextField: UITextField {
var padding = UIEdgeInsets(top: 0.0, left: 0.0, bottom: 0.0, right: 0.0)
@IBInspectable var left: CGFloat = 0 {
didSet {
adjustPadding()
}
}
@IBInspectable var right: CGFloat = 0 {
didSet {
adjustPadding()
}
}
@IBInspectable var top: CGFloat = 0 {
didSet {
adjustPadding()
}
}
@IBInspectable var bottom: CGFloat = 0 {
didSet {
adjustPadding()
}
}
func adjustPadding() {
padding = UIEdgeInsets(top: top, left: left, bottom: bottom, right: right)
}
override func prepareForInterfaceBuilder() {
super.prepareForInterfaceBuilder()
}
override func textRect(forBounds bounds: CGRect) -> CGRect {
return bounds.inset(by: UIEdgeInsets(top: top, left: left, bottom: bottom, right: right))
}
override func placeholderRect(forBounds bounds: CGRect) -> CGRect {
return bounds.inset(by: UIEdgeInsets(top: top, left: left, bottom: bottom, right: right))
}
override func editingRect(forBounds bounds: CGRect) -> CGRect {
return bounds.inset(by: UIEdgeInsets(top: top, left: left, bottom: bottom, right: right))
}
}
Ответ 9
Вы можете попробовать это
TextField.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;
TextField.textAlignment = UITextAlignmentCenter;