UITextField не регистрирует доступную ширину внутри UIStackView - PullRequest
1 голос
/ 12 июня 2019

Я хочу поместить две кнопки с изображениями по левому и правому краю экрана и вставить UITextField между ними. В storyboard все хорошо, но мне нужно сделать это программно.

Источник:

class SecondViewController: UIViewController {


override func loadView() {
    super.loadView();
    self.view.backgroundColor = .white;
    let leftButton = UIButton();
    leftButton.setImage(UIImage(named: "first"), for: .normal);
    leftButton.setTitle("", for: .normal);

    let rightButton = UIButton();
    rightButton.setImage(UIImage(named: "second"), for: .normal);
    rightButton.setTitle("", for: .normal);

    let textField = UITextField();
    textField.placeholder = "clear";
    textField.borderStyle = .roundedRect;
    textField.contentHorizontalAlignment = .left;
    textField.contentVerticalAlignment = .center;

    let stackView = UIStackView();

    stackView.translatesAutoresizingMaskIntoConstraints = false;
    stackView.alignment = .fill;
    stackView.distribution = .fill;
    stackView.axis = .horizontal;
    stackView.spacing = 15;

    stackView.addArrangedSubview(leftButton);
    stackView.addArrangedSubview(textField);
    stackView.addArrangedSubview(rightButton);

    self.view.addSubview(stackView);

    NSLayoutConstraint(item: stackView, attribute: .leading, relatedBy: .equal, toItem: self.view, attribute: .leading, multiplier: 1.0, constant: 15).isActive = true;
    NSLayoutConstraint(item: stackView, attribute: .trailing, relatedBy: .equal, toItem: self.view, attribute: .trailing, multiplier: 1.0, constant: -15).isActive = true;
    NSLayoutConstraint(item: stackView, attribute: .top, relatedBy: .equal, toItem: self.view, attribute: .top, multiplier: 1.0, constant: 50).isActive = true;

}

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.
}

Мне нужен результат, как на первом изображении.

I need result like this

Но в результате у меня есть второе. but got this

Что я делаю не так?

Ответы [ 2 ]

2 голосов
/ 12 июня 2019

У вас есть элементарное ограничение неопределенности. Вы могли бы легко обнаружить это, просто переключившись на View Debugger; Вы увидите три восклицательных знака, предупреждающих вас о проблеме. Механизм компоновки волшебным образом не знает, какой из трех видов должен быть растянут горизонтально. Вы должны сказать это:

textField.setContentHuggingPriority(UILayoutPriority(249), for: .horizontal)
1 голос
/ 12 июня 2019

Установить ограничения, такие как

NSLayoutConstraint.activate([
    stackView.topAnchor.constraint(equalTo: self.view.topAnchor, constant: 50),
    stackView.leadingAnchor.constraint(equalTo: self.view.leadingAnchor, constant: 15),
    stackView.trailingAnchor.constraint(equalTo: self.view.trailingAnchor, constant: -15),
    stackView.heightAnchor.constraint(equalToConstant: 45),
    leftButton.widthAnchor.constraint(equalToConstant: 30), 
    rightButton.widthAnchor.constraint(equalToConstant: 30),
])

Еще одно небольшое изменение

rightButton.imageView?.contentMode = .scaleAspectFit
leftButton.imageView?.contentMode = .scaleAspectFit

Результат

enter image description here

...