2015-04-08 4 views
2

У меня есть UITextField, который я подаю нижнюю границу с помощью следующего метода в UITextField категории:Ширина рамки UITextField слишком короткая?

-(void)addBottomBorder { 
    CALayer *border = [CALayer layer]; 
    CGFloat borderWidth = 1; 

    // For the sake of visibility 
    border.borderColor = [UIColor redColor].CGColor; 
    self.backgroundColor = [UIColor whiteColor]; 

    border.frame = CGRectMake(0, self.frame.size.height - borderWidth, self.frame.size.width, self.frame.size.height); 
    border.borderWidth = borderWidth; 

    [self.layer addSublayer:border]; 

    self.layer.masksToBounds = YES; 
} 

Самое смешное, что красная нижняя граница не охватывает всю ширину текстового поля ,

Вот скриншот поведения. Любые идеи относительно того, что может быть причиной этого? hmmm?

ответ

3

Если вы используете авторезистирующие маски, например гибкую ширину представления, текстовое поле e.t.c, то в этом случае вы должны добавить пограничный слой после успешного изменения ваших представлений в соответствии с разрешениями и ограничениями автоматического изменения размера.

Проблема в вашем случае выглядит так, что у вас есть текстовое поле, на котором вы добавили слой с текущими размерами текста, и после добавления слоя текстовое поле будет изменено в соответствии с ограничениями автоматического изменения размера. Но слой не был изменен в соответствии с ограничениями и имеет более раннее измерение, которое приводит к разнице в ширине между вашим текстовым полем и пограничным слоем.

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

В качестве альтернативы, создайте 1 пиксель UIView ниже поданного текста и установите его горизонтальные маски авторезистирования так же, как и текст.

+1

Я переместил процедуру, которая добавляет границу из 'viewDidLoad' в' viewDidLayoutSubviews', поскольку граница действительно добавлялась до применения ограничений. – Timothy

0

Попробуйте установить цвет после того, как вы установите BorderWidth

0

Является ли проблема, что слой на границе в настоящее время затемняется rightView? Не могли бы вы попытаться добавить границу в форме UIView в виде подсмотра текстового вида?

1

Было бы проще создать UIView, который имеет высоту 1p и закреплен на нижней и боковой сторонах ограничениями в раскадровке. Ваша проблема, исходя из того, что я понимаю, происходит только тогда, когда ширина вашего текстового поля на экране превышает размер, который он имеет в раскадровке, потому что textField растягивается ПОСЛЕ того, что нижняя строка добавлена, поэтому она не растягивается вместе с полем.

2

Так много вопросов, там ...

  • что, если ваш UITextField будет изменять?
  • что делать, если будет leftView/rightView и они скрывают основной вид?
  • если вы добавляете подвид, вы должны использовать bounds, не frame
  • что, если bounds.origin.x != 0? то же для bounds.origin.y

... самый простой способ - сделать то, что рекомендует Kristaps.

0

Подсловы не расположены автоматически. Вы не планируете свой подуровень.

Не связывайтесь с текстовым полем, вместо этого оберните его в декоративный вид и добавьте цвет фона или что-то еще с 2-мя пиксельными прокладками внизу.

0

Просто добавьте вызов границы рисунка внутри setNeedsLayout вместо awakeFromNib

Тогда из setNeedsLayout на вид контроллер вызовов подвида от viewDidLayoutSubviews

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

@interface FieldsViewController() 

@property (strong, nonatomic) IBOutletCollection(CustomTextField) NSArray *textFields; 

@end 

@implementation FieldsViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
} 

- (void)viewDidLayoutSubviews { 
    for (CustomTextField *textField in self.textFields) { 
     [textField setNeedsLayout]; 
    } 
} 

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