UIScrollView не прокручивается несмотря на добавление ограничений Auto Layout
Я работаю над проектом, в котором я добавил несколько UITextFields в UIView, который действует как контейнерное представление. Затем я добавляю этот контейнерный вид в UIScrollView, который, в свою очередь, я добавляю в основной вид моего экрана. Проблема в том, что мой контейнерный вид появляется на экране, но не прокручивается, несмотря на то, что он прикреплен к UIScrollView, и я не могу сказать, почему. Весь код и ограничения есть в Swift.
Ниже приведен соответствующий код, который у меня есть:
private func setupViews() {
view.backgroundColor = .nzRedColor()
registerView.frame = CGRect(x: 0.0, y: 0.0, width: self.view.frame.width, height: self.view.frame.height)
registerView.backgroundColor = UIColor.green
registerScrollView.frame = CGRect(x: 0.0, y: 0.0, width: self.view.frame.width, height: 300.0)
registerScrollView.backgroundColor = UIColor.blue
let addViewsClosure = { (superview: UIView, views: UIView...)->() in
for view in views {
view.translatesAutoresizingMaskIntoConstraints = false
if ((view as? UIImageView) != nil) {
superview.addSubview(view)
} else if ((view as? UITextField) != nil) {
self.registerView.addSubview(view)
self.registerScrollView.addSubview(self.registerView)
superview.addSubview(self.registerScrollView)
} else {
superview.addSubview(view)
}
}
}
let customizeTextFields = { (textfields: UITextField...) in
for textfield in textfields {
textfield.backgroundColor = UIColor(white: 1.0, alpha: 0.3)
textfield.font = UIFont.systemFont(ofSize: 14, weight: UIFontWeightRegular)
textfield.layer.cornerRadius = 2.0
}
}
customizeTextFields(firstNameTextField, lastNameTextField, cityTextField, countryTextField, emailTextField, passwordTextField, passwordConfirmationTextField)
addViewsClosure(view, logoImageView, firstNameTextField, lastNameTextField, cityTextField, countryTextField, emailTextField, passwordTextField, passwordConfirmationTextField, registerButton, skipButton)
logoImageView.constrainTop(at: 50, after: topLayoutGuide.anchorableRepresentation)
logoImageView.constrainCenterHorizontally()
logoImageWidthConstraint = logoImageView.constrainWidth(at: 0)
logoImageHeightConstraint = logoImageView.constrainHeight(at: 0)
updateLogoImageSize()
firstNameTextField.constrainTop(at: 10, after: logoImageView)
firstNameTextField.constrainHeight(at: 50)
firstNameTextField.constrainLeading(alignedWith: view, offset: 10)
firstNameTextField.constrainTrailing(alignedWith: view, offset: -10)
lastNameTextField.constrainTop(at: 10, after: firstNameTextField)
lastNameTextField.constrainHeight(at: 50)
lastNameTextField.constrainLeading(alignedWith: firstNameTextField)
lastNameTextField.constrainTrailing(alignedWith: firstNameTextField)
cityTextField.constrainTop(at: 10, after: lastNameTextField)
cityTextField.constrainHeight(at: 50)
cityTextField.constrainLeading(alignedWith: firstNameTextField)
cityTextField.constrainTrailing(alignedWith: firstNameTextField)
countryTextField.constrainTop(at: 10, after: cityTextField)
countryTextField.constrainHeight(at: 50)
countryTextField.constrainLeading(alignedWith: firstNameTextField)
countryTextField.constrainTrailing(alignedWith: firstNameTextField)
emailTextField.constrainTop(at: 10, after: countryTextField)
emailTextField.constrainHeight(at: 50)
emailTextField.constrainLeading(alignedWith: firstNameTextField)
emailTextField.constrainTrailing(alignedWith: firstNameTextField)
passwordTextField.constrainTop(at: 10, after: emailTextField)
passwordTextField.constrainHeight(at: 50)
passwordTextField.constrainLeading(alignedWith: firstNameTextField)
passwordTextField.constrainTrailing(alignedWith: firstNameTextField)
passwordConfirmationTextField.constrainTop(at: 10, after: passwordTextField)
passwordConfirmationTextField.constrainHeight(at: 50)
passwordConfirmationTextField.constrainLeading(alignedWith: firstNameTextField)
passwordConfirmationTextField.constrainTrailing(alignedWith: firstNameTextField)
registerView.constrainTop(at: 0)
registerView.constrainHeight(at: self.view.frame.height)
registerView.constrainLeading(at: 0)
registerView.constrainTrailing(at: 0)
registerScrollView.constrainTop(at: 50, after: logoImageView)
registerScrollView.constrainHeight(at: 300.0)
registerScrollView.constrainLeading(at: 0)
registerScrollView.constrainTrailing(at: 0)
registerButton.constrainTop(at: 30, after: passwordConfirmationTextField)
registerButton.constrainHeight(at: 50)
registerButton.constrainLeading(alignedWith: firstNameTextField)
registerButton.constrainTrailing(alignedWith: firstNameTextField)
skipButton <- { $0.top >= registerButton.anchors.bottom + 12 }
skipButton.constrainBottom(at: 12)
skipButton.constrainCenterHorizontally()
}
Здесь я хотел бы отметить две вещи:
Несмотря на то, что я сделал фоновый цвет registerView зеленым, я не вижу его.
По какой-то причине все UITextFields появляются непосредственно в UIScrollView (потому что его цвет синий), а UIScrollView видим, но, к сожалению, не прокручивается. Кто-нибудь может увидеть, что я делаю не так?
1 ответ
При использовании автоматического макета с представлениями прокрутки содержимое представления прокрутки определяет .contentSize
, Это означает, что ваш registerView
все его ограничениядолжны быть установлены правильно.
Вы устанавливаете registerView
фон зеленый, но вы не видите вид? Могу поспорить, если вы установите его .clipsToBounds
в true
Вы больше не увидите текстовые поля.
registerView.constrainTop(at: 0)
registerView.constrainHeight(at: self.view.frame.height)
registerView.constrainLeading(at: 0)
registerView.constrainTrailing(at: 0)
Вы установили ограничения Top, Leading, Trailing и Height - но похоже, что вам не хватает ширины и ширины.
Нижнее ограничение, вероятно, должно быть установлено на 0
- как Top, Leading и Trailing.
Я предполагаю, что вы хотите registerView
Ограничение высоты определяется последним текстовым полем - passwordConfirmationTextField
- но если это так, ты все еще скучаешь по этому.