自动布局后获取视图框架
Get frame of a view after 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 在自动布局处理后的结果框架
解决方案:(使用 'Masonry' 自动布局)
- (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;
}
您可以在viewDidLayoutSubviews
中调整下划线的边框,自动布局设置所有边框后调用
请注意,您每次都在创建新视图并调用 addSubview:
。当你在这个方法之外创建文本视图时,你应该这样做一次。否则,您将在每次用户旋转设备时创建一个新的 UIView
。
你的下划线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 下方的一个单元,所以请确保在 textField
的情节提要中取消设置 Clip Subviews
我希望这对你有用。如果您有任何问题,请告诉我!
我有一个方法:
- (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' 自动布局)
- (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;
}
您可以在viewDidLayoutSubviews
中调整下划线的边框,自动布局设置所有边框后调用
请注意,您每次都在创建新视图并调用 addSubview:
。当你在这个方法之外创建文本视图时,你应该这样做一次。否则,您将在每次用户旋转设备时创建一个新的 UIView
。
你的下划线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 下方的一个单元,所以请确保在 textField
Clip Subviews
我希望这对你有用。如果您有任何问题,请告诉我!