我有一个方法:

- (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 ;文本字段的宽度根据屏幕宽度( Nib 自动布局)而变化。

我试过使用
[self.view setNeedsLayout];
[self.view layoutIfNeeded];


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

在我调用此方法之前,结果没有变化。结果行比 UITextField 宽得多(它与 Nib 中的原始大小匹配)。

在被自动布局处理后,我只想要有问题的 UITextField 的结果帧

解决方案:(使用“砌体”自动布局)
- (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;
}

最佳答案

您的下划线 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 调用之后,您的 View 的框架应该是正确的。我希望我的常量是正确的。由于该行出现在 textView 下的一个单元,因此请确保在 Storyboard中为 Clip Subviews 取消设置 textField
我希望这对你有用。如果您有问题,请告诉我!

关于ios - 自动布局后获取 View 的框架,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29396122/

10-14 20:36