2015-04-01 4 views
3

У меня есть метод:Получить кадр после того, как вид autolayout

- (void)underlineTextField:(UITextField *)tf { 
    CGFloat x = tf.frame.origin.x-8; 
    CGFloat y = tf.origin.y+tf.frame.size.height+1; 
    CGFloat width = self.inputView.frame.size.width-16; 
    UIView *line = [[UIView alloc] initWithFrame:(CGRect){x,y,width,1}]; 
    line.backgroundColor = [UIColor whiteColor]; 
    [self.inputView addSubview:line]; 
} 

Это подчеркивает вход UITextField; Текстовое поле имеет ширину, которая изменяется в зависимости от ширины экрана (автозапуск автозапуска).

Я попытался с помощью

[self.view setNeedsLayout]; 
[self.view layoutIfNeeded]; 

и

[self.inputView setNeedsLayout]; 
[self.inputView layoutIfNeeded]; 

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

Я просто хочу получившийся кадр UITextField в вопросе после обработки в autolayout

РЕШЕНИЕ: (с использованием «кирпичной кладкой» Autolayout)

- (UIView *)underlineTextField:(UITextField *)tf { 
    UIView *line = [[UIView alloc] initWithFrame:CGRectZero]; 
    line.backgroundColor = [UIColor whiteColor]; 
    [self.inputView addSubview:line]; 
    [line mas_makeConstraints:^(MASConstraintMaker *make) { 
     make.centerX.equalTo(tf.mas_centerX); 
     make.width.equalTo(tf.mas_width).with.offset(16); 
     make.height.equalTo(@1); 
     make.top.equalTo(tf.mas_bottom); 
    }]; 
    return line; 
} 

ответ

4

У вашей подписи view есть статический фрейм, он не связан с textField через ограничения. Вместо того чтобы устанавливать рамку, добавить ограничения self.inputView

- (void)underlineTextField:(UITextField *)tf { 
    UIView *line = [[UIView alloc] init]; 
    line.backgroundColor = [UIColor whiteColor]; 
    [line setTranslatesAutoresizingMaskIntoConstraints:NO]; 
    [self.inputView addSubview:line]; 

    // Vertical constraints 
    [self.inputView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[line(==1)]-(-1)-|" options:0 metrics:nil views:@{ @"line": line}]]; 

    // Horizontal constraints 
    [self.inputView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-(-8)-[line]-8-|" options:0 metrics:nil views:@{ @"line": line}]]; 

    [self.inputView layoutIfNeeded]; 
} 

После layoutIfNeeded вызова, рамки для зрения должны быть правильными. Я надеялся, что у меня есть константы. Поскольку линия появляется на одном блоке под текстом, убедитесь, что она не установлена ​​Clip Subviews в раскадровке для textField

Я надеюсь, что это сработает для вас. Дайте мне знать, если у вас есть вопросы!

+0

ура, я не уверен в полной программе для автоматической автоаудитации, но я нашел «масонство» большой помощью: – Halpo

0

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

Обратите внимание, что вы создаете новое представление и вызываете addSubview: каждый раз. Вы должны сделать это один раз при создании текстового представления вне этого метода. В противном случае вы создадите новый UIView каждый раз, когда ваш пользователь поворачивает устройство.

+0

'viewDidLayoutSubviews' вызывается примерно 20 раз при загрузке, я просто хочу, чтобы это выполнялось один раз. есть причина, почему -setNeedsLayout не работает? – Halpo

+0

'setNeedsLayout' не делает этого. Вы не хотите, чтобы он выполнялся один раз. Вы хотите обновлять фрейм каждый раз, когда изменяется формат фрейма inputView. –

+0

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

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