自动布局后获取视图的帧

时间:2015-04-01 16:32:36

标签: ios autolayout textfield

我有一个方法:

- (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的结果框架

解决方案:(使用' Masonry' 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;
}

2 个答案:

答案 0 :(得分: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来电后,您的观看框架应该是正确的。我希望我的常数合适。由于该行在textView下方显示一个单元,因此请务必在Clip Subviews

的故事板中取消设置textField

我希望这适合你。如果您有任何疑问,请与我联系!

答案 1 :(得分:0)

您可以调整viewDidLayoutSubviews中下划线的框架,该框架在自动布局设置了所有框架后调用。

请注意,您每次都要创建一个新视图并调用addSubview:。在此方法之外创建文本视图时,应该执行一次。否则,每次用户旋转设备时,您都会创建一个新的UIView