Набор прокладок для UITextField с UITextBorderStyleNone
Я хочу использовать пользовательский фон для моего UITextFields. Это отлично работает за исключением того, что я должен использовать UITextBorderStyleNone чтобы он выглядел красиво. Это заставляет текст придерживаться влево без каких-либо отступов.
могу ли я установить заполнение вручную, чтобы оно было похоже на UITextBorderStyleRoundedRect за исключением использования моего пользовательского фонового изображения?
30 ответов:
Я нашел аккуратный маленький хак, чтобы установить левую прокладку для этой точной ситуации.
В основном, вы устанавливаете свойство leftView
UITextFieldчтобы быть пустой вид размера заполнения вы хотите:UIView *paddingView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 5, 20)]; textField.leftView = paddingView; textField.leftViewMode = UITextFieldViewModeAlways;работал как шарм для меня!
на Swift 3, это может быть сделано путем делать что
let paddingView: UIView = UIView(frame: CGRect(x: 0, y: 0, width: 5, height: 20)) textField.leftView = paddingView textField.leftViewMode = .always
Я создал эту реализацию категории и добавил ее в верхнюю часть .
@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на основе ссылки Петр Блазяк предоставил. Это казалось проще, чем создание целого нового подкласса, а также проще, чем добавление дополнительного
UIView. Тем не менее, кажется, что чего-то не хватает, чтобы не иметь возможности контролировать заполнение внутри текстового поля.Swift 2 решение:
import UIKit class CustomTextField: UITextField { required init?(coder aDecoder: NSCoder){ super.init(coder: aDecoder) } override func textRectForBounds(bounds: CGRect) -> CGRect { return CGRectMake(bounds.origin.x + 10, bounds.origin.y + 8, bounds.size.width - 20, bounds.size.height - 16); } override func editingRectForBounds(bounds: CGRect) -> CGRect { return self.textRectForBounds(bounds); } }
версия Swift 3 для Xcode >6, где вы можете редактировать значение вставки в 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) } }
хороший подход для добавления заполнения в UITextField - это подкласс и добавление свойства edgeInsets. Затем вы устанавливаете edgeInsets и UITextField будет нарисован соответственно. Это также будет правильно работать с пользовательским набором leftView или rightView.
OSTextField.h
#import <UIKit/UIKit.h> @interface OSTextField : UITextField @property (nonatomic, assign) UIEdgeInsets edgeInsets; @endOSTextField.м
#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
Edit: все еще работает в iOS 11.3.1
В iOS 6
myTextField.leftView = paddingView;вызывает вопросЭто решает проблему
myTextField.layer.sublayerTransform = CATransform3DMakeTranslation(5, 0, 0)для выравнивания по правому краю текстового поля используйте
CATransform3DMakeTranslation(-5, 0, 0)как говорится в latenitecoder в комментариях
просто подкласс UITextField, как это:
@implementation DFTextField - (CGRect)textRectForBounds:(CGRect)bounds { return CGRectInset(bounds, 10.0f, 0); } - (CGRect)editingRectForBounds:(CGRect)bounds { return [self textRectForBounds:bounds]; } @endэто добавляет горизонтальное заполнение 10 точек с каждой стороны.
Код Цели C
MyTextField.h
#import <UIKit/UIKit.h> @interface MyTextField : UITextField @property (nonatomic) IBInspectable CGFloat padding; @endMyTextField.м
#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
на основе ответа Evil Trout вы можете создать Категорию, чтобы упростить ее использование в нескольких приложениях.
заголовочный файл:
@interface UITextField (PaddingText) -(void) setLeftPadding:(int) paddingValue; -(void) setRightPadding:(int) paddingValue; @endфайл:
#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Пример Использования
#import "UITextField+PaddingText.h" [self.YourTextField setLeftPadding:20.0f];надеюсь, что это помогает вам, ребята!--4-->
Ура
- создать текстовое поле Custom
PaddingTextField.Свифт
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) }}
Swift версия:
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) } } }Так что вы можете назначить значение В IB
вы не можете установить отступ. Вместо этого есть
UIViewкоторый имеет фоновое изображение иUITextFieldвнутри него. УстановитеUITextFieldширинаUIViewWidth-(paddingSize x 2)и высота аналогично, а затем установить его в точкеpaddingSize,paddingSize.
просто подкласс UITextField такой ( 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) } }это добавляет горизонтальное заполнение 25.0 точки с каждой стороны.
Я был основан на решении Нейта, но потом я обнаружил, что это вызывает проблемы при использовании свойств leftView/rightView, поэтому его лучше настроить реализацию супер, потому что он будет учитывать левое/правое представление.
- (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]; }
вот как этого добиться в 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 } }
Версия Swift 2.0:
let paddingView: UIView = UIView(frame: CGRectMake(0, 0, 5, 20)) textField.leftView = paddingView textField.leftViewMode = UITextFieldViewMode.Always;
^ эти предложения отлично подходят для тех, кто программно создает интерфейс.
но есть два ленивых простых способа для тех из нас, кто использует Xcode interface builder:
проще: поместите UIImageView за текстовое поле
самый простой: измените стиль границы на вашем простом черном квадрате (второй слева), а затем добавьте свое изображение в качестве фонового изображения. изображение имеет приоритет над квадратом, так что вы все еще получаете заполнение, необходимое для нормального фона изображения, без квадрата на самом деле рисуется.
EDIT: вы также можете использовать черную сферу (третья слева опция при выборе UITextBox В IB), она не работает с крайним правым стилем "графическая сфера".
лучший способ сделать это-просто сделать класс, используя подкласс UITextField и in .файл м
#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; }сделав это, перейдите к своей раскадровке или xib и нажмите на Identity inspector и замените UITextfield своим собственным "CustomTextField" в опции класса.
Примечание: Если вы просто даете заполнение с автоматической компоновкой для текстового поля, то ваше приложение не будет работать и показывать только пустой экран.
обновленная версия для 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) } }
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) } }
установить заполнение для UITextField с UITextBorderStyleNone: Swift
на основе наиболее проголосовавшего ответа @Evil Trout я создал пользовательский метод в своем классе ViewController, как показано ниже:
- (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]]; }теперь я могу вызвать этот метод внутри (метод viewDidLoad) и отправить любое из моих текстовых полей в этот метод и добавить заполнение как справа, так и слева, а также дать цвета текста и фона, написав только одну строку кода, следующим образом:
[self modifyTextField:self.firstNameTxtFld];Это Работает отлично на iOS 7! Я знаю, что добавление слишком большого количества представлений может сделать этот класс немного более тяжелым для загрузки. Но когда я беспокоился о трудностях в других решениях, я обнаружил, что более склонен к этому методу и более гибок в использовании этого способа. ;)
Спасибо за Хак "злая форель"! (поклон)
Я подумал, что должен обновить фрагмент кода этого ответа с помощью Swift:
поскольку Swift позволяет нам писать расширения для существующих классов, давайте запишем его в этом путь.
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() } }использование:
self.firstNameTxtFld.addPaddingToTextField()надеюсь, что это будет полезно для кого-то еще там!
Ура!
@ ответ злой форели велик. Я использую этот подход уже довольно давно. Единственное, чего ему не хватает, это "работа с многочисленными текстовыми полями". Я пробовал другие подходы, но, похоже, не работает.
подкласс UITextField просто добавить дополнение не имеет никакого смысла для меня. Итак, я повторил все UITextFields, чтобы добавить заполнение.
-(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]]; } } }
решение Броди работало идеально для меня. Мне пришлось добавить боковые виды на текстовое поле и добавить дополнительное заполнение. Таким образом, путем реализации пользовательского свойства UIEdgeInsets в подклассе UITextField мне удалось достичь этой задачи. Я собираюсь использовать этот новый подкласс во всех моих проектах.
вот быстрый код, чтобы дать заполнение в UITextfield
func txtPaddingVw(txt:UITextField) { let paddingView = UIView(frame: CGRectMake(0, 0, 10, 10)) txt.leftViewMode = .Always txt.leftView = paddingView }и звонок с помощью
self.txtPaddingVw(txtPin)
если кто-то ищет
Swift 4.0версии, то нижеextensionработа. Он имеет обаLeftиRightобивкаUITextField. На самом деле этоIBInspectableнастройки раскадровки. Вы можете установить значение непосредственно из конструктора интерфейса / раскадровки. Это тестируемый код в версии Swift 4.0 и Xcode 9.0имейте в виду, что если вы хотите включить
Clear Buttonв той жеUITextFieldтогда вы должны держать правую прокладку пустой.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 } } }
другое соображение заключается в том, что если у вас есть больше чем один
UITextFieldгде вы добавляете отступ, это создать отдельныйUIViewдля каждого текстового поля-потому что они не могут быть общими.
почему бы не приписать строки !?!, это одна из особенностей благословения IOS 6.0:)
NSMutableParagraphStyle *mps = [[NSMutableParagraphStyle alloc] init]; mps.firstLineHeadIndent = 5.0f; UIColor *placeColor = self.item.bgColor; textFieldInstance.attributedPlaceholder = [[NSAttributedString alloc] initWithString:@"My Place Holder" attributes:@{NSForegroundColorAttributeName: placeColor, NSFontAttributeName : [UIFont systemFontOfSize:7.0f], NSParagraphStyleAttributeName : mps}];
Нейт Флинк ответ мой любимый, но не забывайте о правых/левых взглядов. Например, для
UITextFieldподкласс:override func rightViewRectForBounds(bounds: CGRect) -> CGRect { let rightViewBounds = super.rightViewRectForBounds(bounds) return CGRectMake(CGRectGetMinX(rightViewBounds) - 10, CGRectGetMinY(rightViewBounds), CGRectGetWidth(rightViewBounds), CGRectGetHeight(rightViewBounds)) }над кодом установите правую прокладку для
rightViewнаUITextField.
вы можете использовать категории. установите отступы влево и вправо
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; @endUITextField + Padding.м
#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вы можете установить отступ такой личность.phoneNumTF.paddingValue=10.Ф; или личность.phoneNumTF.leftPadding=10.f;
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) } }






Comments