自动布局 UITextField 以适应 UINavigationBar

Posted

技术标签:

【中文标题】自动布局 UITextField 以适应 UINavigationBar【英文标题】:AutoLayout UITextField to fit UINavigationBar 【发布时间】:2014-09-15 21:31:01 【问题描述】:

我一直在尝试调整 UITextField 的大小以适应并延伸到整个 UINavigationBar,但没有成功。我知道这是世界上最简单的问题,但我没有注意到。

【问题讨论】:

【参考方案1】:

这不是世界上最简单的问题。其实挺麻烦的。

你不能使用约束来做到这一点。 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 中做到这一点吗? 照我做的。没有什么棘手或微妙的事情发生。【参考方案2】:

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!
    


【讨论】:

以上是关于自动布局 UITextField 以适应 UINavigationBar的主要内容,如果未能解决你的问题,请参考以下文章

iOS - 以编程方式在具有自动布局的 UITextField 内定位 UIImageView

自动更改 textSize 以适应布局宽度 [重复]

iOS自动布局:相等的空间以适应超级视图宽度[重复]

如何使用 Xcode 8 上的自动布局调整对象的大小以适应不同的屏幕尺寸?

自动布局 UITextfield

UITableViewCell 中的 UITextField 使用自动布局