【发布时间】:2014-09-15 21:31:01
【问题描述】:
我一直在尝试调整 UITextField 的大小以适应并延伸到整个 UINavigationBar,但没有成功。我知道这是世界上最简单的问题,但我没有注意到。
【问题讨论】:
标签: ios swift autolayout constraints frame
我一直在尝试调整 UITextField 的大小以适应并延伸到整个 UINavigationBar,但没有成功。我知道这是世界上最简单的问题,但我没有注意到。
【问题讨论】:
标签: ios swift autolayout constraints frame
这不是世界上最简单的问题。其实挺麻烦的。
你不能使用约束来做到这一点。 UINavigationBar 负责布置其子视图。 Xcode 知道这一点,因此它不允许您在文本字段上设置约束。
导航栏通过发送sizeThatFits: 询问您的文本字段想要多大,并提供最大允许大小,因此一种方法是创建UITextField 的子类以返回该最大值。这有效:
@implementation MyTextField
- (CGSize)sizeThatFits:(CGSize)size {
return size;
}
@end
另一种方法是使文本字段非常宽,并让导航栏缩小以适应。您需要在旋转时重置宽度,因为导航栏一旦缩小就不会再次拉伸文本字段。在您的视图控制器中创建一个连接到文本字段的插座,并在布局之前更新宽度。这有效:
@interface ViewController ()
@property (strong, nonatomic) IBOutlet UITextField *textField;
@end
@implementation ViewController
- (void)viewWillLayoutSubviews {
[super viewWillLayoutSubviews];
[self widenTextField];
}
- (void)widenTextField {
CGRect frame = self.textField.frame;
frame.size.width = 10000;
self.textField.frame = frame;
}
@end
【讨论】:
Swift 4 版本
class ViewController: UIViewController {
@IBOutlet var textField: UITextField!
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
widenTextField()
}
func widenTextField() {
var frame: CGRect? = textField?.frame
frame?.size.width = 10000
textField?.frame = frame!
}
}
【讨论】: