iOS UIStackView.выравнивание заполнения внутри UIScrollView не работает

#ios #swift #xcode #storyboard

#iOS #swift #xcode #раскадровка

Вопрос:

У меня есть представление стека, которое программно вставляется в представление прокрутки (которое работает отлично), но когда я помещаю представление прокрутки внутри контроллера представления в раскадровке, выравнивание выполняется .fill , и распределение компонента не применимо через пользовательский интерфейс. Затем я закодировал его, как показано ниже, но он все равно не работал.

Ниже приведен код программной реализации:

 class RegisterVC: UIViewController{
    
    private let dataSource = ["Student","Academic Staff","Non academic Staff"]

    @IBOutlet weak var userPicker: UIPickerView!
    
    @IBOutlet weak var FirstName: UITextField!
    
    @IBOutlet weak var LastName: UITextField!
    
    @IBOutlet weak var EmailAddress: UITextField!
    @IBOutlet weak var Password: UITextField!
    
    //message popping validator labels
    
    
   
    @IBOutlet weak var firstNameLabel: UILabel!
    @IBOutlet weak var lastNameLabel: UILabel!
    @IBOutlet weak var emailAddressLabel: UILabel!
    @IBOutlet weak var passwordLabel: UILabel!
    
    @IBOutlet weak var scrollView: UIScrollView!
    
    @IBOutlet var formStackView: UIStackView!


    override func viewDidLoad() {
        super.viewDidLoad()
        
        scrollView.translatesAutoresizingMaskIntoConstraints = false;
        self.scrollView.addSubview(formStackView)
        
        self.formStackView.translatesAutoresizingMaskIntoConstraints=false
        
        self.formStackView.alignment = .fill
        self.formStackView.distribution = .fillProportionally        
        
        self.formStackView.leadingAnchor.constraint(equalTo: self.scrollView.leadingAnchor,constant: 20).isActive=true
        self.formStackView.trailingAnchor.constraint(equalTo: self.scrollView.trailingAnchor,constant: 20).isActive=true
        self.formStackView.topAnchor.constraint(equalTo: self.scrollView.topAnchor,constant: 50).isActive=true
        self.formStackView.bottomAnchor.constraint(equalTo: self.scrollView.bottomAnchor).isActive=true
        
        //self.formStackView.widthAnchor.constraint(equalTo: self.view.widthAnchor).isActive=true
        
        userPicker.delegate=self
        userPicker.dataSource=self
    }
}
  
 
I'm a very basic beginner in iOS; I need your dire help, thank you.
  

Комментарии:

1. Попробуйте уточнить, что вы делаете. Вы показываете эту строку: self.scrollView.addSubview(formStackView) … но вы не показали, откуда formStackView берется, или, если оно находится в другом контроллере представления, как показано на изображении раскадровки, как вы его загружаете.

2. он поступает из того же источника, и он функционален и работает, проблема в том, что элементы stacke не будут распределяться в соответствии с его родительским элементом (scrollview)

Ответ №1:

Это необычный способ проектирования в раскадровке… вы можете создать свой вид стека непосредственно как подвида вашего вида прокрутки и установить ограничения там (вместо кода).

Но, я предполагаю, что у вас есть причина для этого таким образом, так что…

Вы хотите ограничить верхние / начальные / конечные / нижние ограничения представления стека для руководства по компоновке содержимого в режиме прокрутки… а затем ограничьте его ширину в соответствии с руководством по компоновке рамки в режиме прокрутки.

Попробуйте это так:

 class RegisterVC: UIViewController {
    
    private let dataSource = ["Student","Academic Staff","Non academic Staff"]
    
    @IBOutlet weak var userPicker: UIPickerView!
    
    @IBOutlet weak var FirstName: UITextField!
    
    @IBOutlet weak var LastName: UITextField!
    
    @IBOutlet weak var EmailAddress: UITextField!
    @IBOutlet weak var Password: UITextField!
    
    //message popping validator labels
    
    
    
    @IBOutlet weak var firstNameLabel: UILabel!
    @IBOutlet weak var lastNameLabel: UILabel!
    @IBOutlet weak var emailAddressLabel: UILabel!
    @IBOutlet weak var passwordLabel: UILabel!
    
    @IBOutlet weak var scrollView: UIScrollView!
    
    @IBOutlet var formStackView: UIStackView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // not needed...
        //scrollView.translatesAutoresizingMaskIntoConstraints = false;
        
        // add form stack view to the scroll view
        scrollView.addSubview(formStackView)
        
        // because of the way this is designed in Storyboard,
        //  we need to set this to false
        formStackView.translatesAutoresizingMaskIntoConstraints = false
        
        // stack view alignment .fill
        formStackView.alignment = .fill
        
        // stack view distribution should be .fill
        formStackView.distribution = .fill  // .fillProportionally

        // we want to constrain the stack view to the scroll view's Content Layout Guide
        let svCLG = scrollView.contentLayoutGuide
        
        NSLayoutConstraint.activate([

            formStackView.leadingAnchor.constraint(equalTo: svCLG.leadingAnchor, constant: 20),
            formStackView.trailingAnchor.constraint(equalTo: svCLG.trailingAnchor, constant: 20),
            formStackView.topAnchor.constraint(equalTo: svCLG.topAnchor, constant: 50),
            formStackView.bottomAnchor.constraint(equalTo: svCLG.bottomAnchor),

            // constrain stack view Width to scroll view's Frame Layout Guide
            //  minus 40-pts, because we have 20-pts on each side
            formStackView.widthAnchor.constraint(equalTo: scrollView.frameLayoutGuide.widthAnchor, constant: -40),

        ])
        
    }
}