【发布时间】:2020-04-27 23:08:39
【问题描述】:
我花了两天时间试图让它工作,但没有运气。我在这里和 Google 上花了很多时间研究,虽然有一些关于将 UIImageViews 添加到 UIScrollViews 的信息,但似乎没有太多关于 UITextFields 和 UILabels 等其他内容的信息。
参考下面的代码,我有几个问题:
-
myScrollView中的contentView:即使contentView具有backgroundColor、约束等,contentView似乎没有正确显示,但添加到它的子视图确实显示(参见附上截图)。 - 尽管设置了约束,但添加到
scrollView的contentView中的UITextFields布局不正确。从屏幕截图中可以看出,位于具有类似约束的视图之外的文本字段确实可以正确布局 - 例如橙色文本字段。 - 垂直滚动无法显示(在这种情况下,
thirdTextField,即青色文本字段)未显示并且无法滚动到它。奇怪的是,如果我在secondTextField(即红色文本字段)内输入,它的大小会扩大并继续增长,最终会自动激活UIScrollView的水平滚动。另外,不要将其理解为它嵌入在containerView中,其约束似乎被忽略了。
对于 101 类型的问题,我们将不胜感激并提前致歉。
以下所有内容均以编程方式完成,而不是通过故事板完成。
import UIKit
class ViewController: UIViewController {
lazy var myScrollView: UIScrollView = {
let view = UIScrollView(frame: .zero)
view.backgroundColor = .lightGray
return view
}()
lazy var contentView: UIView = {
let view = UIView()
view.backgroundColor = .blue
return view
}()
var firstTextField = UITextField()
var secondtextField = UITextField()
var thirdTextField = UITextField()
var fourthTextField = UITextField()
var firstLabel = UILabel()
var secondLabel = UILabel()
var aButton = UIButton()
var keyboardToolBar = UIToolbar()
override func viewDidLoad() {
super.viewDidLoad()
// Add first label
view.addSubview(firstLabel)
firstLabel.backgroundColor = .yellow
firstLabel.text = "Yellow Label"
// Layout first label
firstLabel.translatesAutoresizingMaskIntoConstraints = false
firstLabel.topAnchor.constraint(equalTo: view.topAnchor, constant: 100).isActive = true
firstLabel.leftAnchor.constraint(equalTo: view.leftAnchor, constant: 20).isActive = true
firstLabel.rightAnchor.constraint(equalTo: view.rightAnchor, constant: -20).isActive = true
// Add first textfield
view.addSubview(firstTextField)
firstTextField.backgroundColor = .orange
firstTextField.placeholder = "Orange TextField"
// Layout first text field
firstTextField.translatesAutoresizingMaskIntoConstraints = false
firstTextField.topAnchor.constraint(equalTo: view.topAnchor, constant: 150).isActive = true
firstTextField.leftAnchor.constraint(equalTo: view.leftAnchor, constant: 20).isActive = true
firstTextField.rightAnchor.constraint(equalTo: view.rightAnchor, constant: -20).isActive = true
firstTextField.inputAccessoryView = keyboardToolBar
// Add scrollView
view.addSubview(myScrollView)
// Layout scrollview
myScrollView.translatesAutoresizingMaskIntoConstraints = false
myScrollView.topAnchor.constraint(equalTo: firstTextField.bottomAnchor, constant: 20).isActive = true
myScrollView.leftAnchor.constraint(equalTo: view.leftAnchor, constant: 20.0).isActive = true
myScrollView.rightAnchor.constraint(equalTo: view.rightAnchor, constant: -20.0).isActive = true
myScrollView.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: -200.0).isActive = true
// Add ContentView inside scrollview
myScrollView.addSubview(contentView)
// layout contentview
contentView.translatesAutoresizingMaskIntoConstraints = false
contentView.topAnchor.constraint(equalTo: myScrollView.topAnchor, constant: 20.0).isActive = true
contentView.leftAnchor.constraint(equalTo: myScrollView.leftAnchor, constant: 20.0).isActive = true
contentView.rightAnchor.constraint(equalTo: myScrollView.rightAnchor, constant: -20.0).isActive = true
contentView.bottomAnchor.constraint(equalTo: myScrollView.bottomAnchor, constant: -20.0).isActive = true
// Add secondTextfield - inside contentview
contentView.addSubview(secondtextField)
secondtextField.backgroundColor = .red
secondtextField.placeholder = "Red TextField"
secondtextField.inputAccessoryView = keyboardToolBar
// Layout secondtextField - inside contentview
secondtextField.translatesAutoresizingMaskIntoConstraints = false
secondtextField.topAnchor.constraint(equalTo: contentView.topAnchor, constant: 100).isActive = true
secondtextField.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 20).isActive = true
secondtextField.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: -20).isActive = true
// Add thirdtextfield - inside contentview
contentView.addSubview(thirdTextField)
thirdTextField.backgroundColor = .brown
thirdTextField.placeholder = "Brown TextField"
thirdTextField.inputAccessoryView = keyboardToolBar
// Layout thirdtextField - inside contentview
thirdTextField.translatesAutoresizingMaskIntoConstraints = false
// Placed 500 below secondtextfield to use through vertical scrolling
thirdTextField.topAnchor.constraint(equalTo: secondtextField.topAnchor, constant: 500).isActive = true
thirdTextField.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 20).isActive = true
thirdTextField.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: -20).isActive = true
// elements outside of scrollview
// add fourthtextField
view.addSubview(fourthTextField)
fourthTextField.backgroundColor = .systemTeal
fourthTextField.placeholder = "Teal Textfield"
fourthTextField.inputAccessoryView = keyboardToolBar
// layout fourthtextField - over the top of the scrollview (for testing/modelling purposes)
fourthTextField.translatesAutoresizingMaskIntoConstraints = false
fourthTextField.topAnchor.constraint(equalTo: firstTextField.bottomAnchor, constant: 300).isActive = true
fourthTextField.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 10).isActive = true
fourthTextField.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -10).isActive = true
// Add second label
view.addSubview(secondLabel)
secondLabel.backgroundColor = .green
secondLabel.text = "Green Label"
// Layout of second label
secondLabel.translatesAutoresizingMaskIntoConstraints = false
secondLabel.topAnchor.constraint(equalTo: view.bottomAnchor, constant: -150).isActive = true
secondLabel.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 20).isActive = true
secondLabel.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -20).isActive = true
// Add button
view.addSubview(aButton)
aButton.backgroundColor = .systemBlue
aButton.setTitle("A Button", for: .normal)
// Layout button
aButton.translatesAutoresizingMaskIntoConstraints = false
aButton.topAnchor.constraint(equalTo: view.bottomAnchor, constant: -100).isActive = true
aButton.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 20).isActive = true
aButton.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -20).isActive = true
// Add Target to BUtton
aButton.addTarget(self, action: #selector(buttonTapped), for: .touchUpInside)
}
}
【问题讨论】:
-
@SPatel 谢谢。我可以,但从长远来看,我打算如何使用它,这会使它变得更加复杂。另外,我想真正了解和理解为什么这不起作用以及如何解决它。
标签: ios swift uiscrollview uitextfield