自动布局UITextField以适应UINavigationBar

3
我一直在尝试调整UITextField的大小,使其适应并延伸到整个UINavigationBar上,但一直没有成功。我知道这是世界上最简单的问题之一,但我还是无知。
2个回答

8

这并不是世界上最简单的问题,事实上它相当棘手。

你不能使用约束来解决这个问题。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中实现这个吗? - JDev
只需按照我所做的去做。没有任何棘手或微妙的事情发生。 - rob mayoff

0

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!
    }

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接