调整 UITextField 的宽度以横向填充工具栏

Posted

技术标签:

【中文标题】调整 UITextField 的宽度以横向填充工具栏【英文标题】:Adjust width of UITextField to fill toolbar in landscape 【发布时间】:2014-04-07 04:18:11 【问题描述】:

UIToolbar 中,我在栏的中间添加了一个UITextField(作为UIBarButtonItem 添加),旁边还有另一个UIBarButtonItem(操作按钮)。我在最左边和最右边添加了灵活的空格键按钮项目。它在纵向上看起来很棒,但是当我旋转到横向时,它使它们居中并且看起来还可以,但是我需要拉伸文本字段以填充宽度并将最后一个按钮向右推 - 就像它在消息中一样 - on iPhone 和 iPad。

我认为自动布局可以解决问题,但 Apple 声明您不能为 UIBarButtonItems 创建约束。实际上,当我选择任何条形按钮或文本字段时,它不允许创建任何约束。

您能告诉我如何完成此操作吗?谢谢!

编辑:我尝试了其他一些固定/灵活空间的组合。当我不添加任何内容时,文本字段和分享按钮被推到左侧:

如果我改为使用固定空格,它看起来与上面的 0 宽度完全相同,或者如果我设置一个宽度,那么它显然会将它们推倒。最右边的最后一个空格没有效果 - 它没有固定在最右边,所以它会离开屏幕。

我试过左边固定空间,右边灵活,中间固定(或者没有中间),和上面的截图一样。然后我把中间的改成灵活的,结果是这样的:

如果我将第一个更改为灵活,中间没有(或者如果我添加一个固定的),并在右侧固定,则将其移到右侧:

如果第一个是灵活的,中间是灵活的,右边是固定的,是这样的:

在所有情况下,文本字段的宽度都保持与故事板中最初设置的静态值相同。我认为问题在于,当您通过拖动框架设置宽度时,没有可捕捉的蓝色参考线,因此它将始终保持相同的宽度。

我错过了任何空格组合吗?如果我无法在界面构建器中实现所需的行为,如何在代码中实现这一点?

【问题讨论】:

【参考方案1】:

为了获得一个水平拉伸的文本字段,我必须在viewWillAppear 中手动设置它的frame,并且当方向改变时 - 我使用了viewWillTransitionToSize:withTransitionCoordinator:

[coordinator animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext>  __nonnull context) 
    self.textField.frame = CGRectMake(0, 0, self.navigationController.navigationBar.frame.size.width - self.actionButton.width - 55, self.inputTextField.frame.size.height);
 completion:^(id<UIViewControllerTransitionCoordinatorContext>  __nonnull context) 
];

以前的解决方案(在最新的操作系统中不再适用于我):

将此添加到viewDidLoad

self.textField.autoresizingMask = UIViewAutoresizingFlexibleWidth;

【讨论】:

在 Xcode 6.2/ios8 中对我不起作用:UITextField 保持固定大小,因此工具栏在紧凑尺寸下被切掉,在常规尺寸下不够宽。跨度> 我明白了为什么它对我没有工作:我在预览中查看结果,您可以同时查看 iPhone 和 iPad时间,看这里(忽略它说 Swift 的事实:本教程与 Swift 无关):youtube.com/watch?v=p5wD8dvSDbM。显然预览只向您显示您在 IB 中所做的事情,因此预览无法看到答案中的代码。结果,在预览中我的 TextField 没有拉伸,但是当我运行(运行?!)我的代码针对各种设备时(单击停止按钮右侧跳转栏中的设备,然后选择另一个设备), ... ... TextField 自行调整大小以适应可用空间。谢谢! @7stud 奇怪!我无法让它与在模拟器中运行的 iOS 8 一起工作。无论如何,我添加了一个示例,说明如何通过设置其 frame 来做到这一点。 它在 iOS8.2 中对我有用,因为它在视觉上是正确的——但我在控制台中遇到了一些错误:无法同时满足约束。可能以下列表中的至少一个约束是您不想要的。我正在努力。

以上是关于调整 UITextField 的宽度以横向填充工具栏的主要内容,如果未能解决你的问题,请参考以下文章

如何调整 UITextField 占位符文本以适合 UITextField 宽度?

UITextField 不会自动调整宽度以适应内容,直到 resignFirstResponder 被调用?

在 UITableViewCell 中自动调整 UITextField 的大小

在工具栏中设置灵活宽度的文本字段

UIView 根据边缘调整大小

UINavigationBar 中的项目未填充屏幕宽度