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

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

【问题讨论】:

    标签: ios swift autolayout constraints frame


    【解决方案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!
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-07
      • 2014-10-23
      • 1970-01-01
      • 2015-01-01
      相关资源
      最近更新 更多