Использование прокрутки просмотра программно
Я пытаюсь разработать приложение с пользовательским интерфейсом, созданным только программно. Я хочу создать простое представление, которое представляет собой UIScrollView (чтобы иметь возможность прокручивать представление, когда появляется клавиатура) с контейнером (UIView), где мы можем найти кнопку.
Я использую PureLayout, чтобы упростить настройку ограничений, swift 4, Xcode 9.2 beta
Ниже класс этого представления
class SimpleView: UIScrollView {
var containerView: UIView!
var signInButton: UIButton!
var signInLabel: UILabel!
var screenSize: CGSize = CGSize.zero
var shouldSetupConstraints = true
override init(frame: CGRect) {
super.init(frame: frame)
self.screenSize = frame.size
self.containerView = UIView(frame: CGRect.zero)
self.signInButton = UIButton(frame: CGRect.zero)
self.signInLabel = UILabel(frame: CGRect.zero)
self.addSubview(self.containerView)
self.containerView.addSubview(self.signInButton)
self.signInButton.addSubview(self.signInLabel)
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
override func updateConstraints() {
if(shouldSetupConstraints) {
self.layoutSignInButton()
self.layoutSignInLabel()
shouldSetupConstraints = false
}
super.updateConstraints()
}
private func layoutContainerView() {
self.containerView.autoPinEdgesToSuperviewEdges()
self.containerView.backgroundColor = UIColor.yellow
}
private func layoutSignInButton() {
self.signInButton.autoPinEdge(toSuperviewEdge: .right)
self.signInButton.autoPinEdge(toSuperviewEdge: .left)
self.signInButton.autoPinEdge(toSuperviewEdge: .top)
self.signInButton.autoSetDimension(.height, toSize: 55.0)
self.signInButton.backgroundColor = UIColor(hex: "#FD9FA2")
}
private func layoutSignInLabel() {
self.signInLabel.autoPinEdgesToSuperviewEdges()
self.signInLabel.shadowColor = UIColor(hex: "#9A615E")
self.signInLabel.shadowOffset = CGSize(width: 0.0, height: 2)
self.signInLabel.text = NSLocalizedString("SIGN IN", comment: "")
self.signInLabel.textAlignment = .center
self.signInLabel.textColor = UIColor.white
self.signInLabel.font = UIFont.boldSystemFont(ofSize: 15.0)
self.signInLabel.backgroundColor = UIColor.clear
}
}
Ниже код подкласса UIViewController, встраивающий предыдущее представление
class SignInViewController: UIViewController {
var simpleView: SimpleView!
override func viewDidLoad() {
super.viewDidLoad()
self.simpleView = SimpleView(frame: self.view.bounds) // with SimpleView(frame: self.view.frame) has the same behaviour
self.view.addSubview(self.simpleView)
self.simpleView.autoPinEdgesToSuperviewEdges()
self.navigationController?.navigationBar.isHidden = true
}
}
К сожалению, результат не тот, который ожидается: см. Ниже
Что мне не хватает? Различные точки отсутствуют: - Положение кнопки странное (пространство между кнопкой и верхней / левой стороной кнопки частично скрыто за пределами экрана) - вид контейнера невидим (backgroundColor = UIColor.yellow не оказывает влияния)
Спасибо заранее!
//////////////////////////// РЕДАКТИРОВАТЬ ///////////////////// ///////////
Ниже приведен скриншот того же кода с использованием UIView вместо UIScrollView
Class SimpleView: UIView {
1 ответ
Содержание UIScrollView
также должен определить.contentSize` представления прокрутки.
Я не использую PureLayout, поэтому я не знаю, каков синтаксис, но в вашем layoutContainerView()
func, вам также нужно сделать:
self.containerView ... set width dimension to SuperviewWdith
Это будет устанавливать содержание containerView
на ширину вида прокрутки, и это должно исправить часть ширины.
Я предполагаю, что вы будете добавлять элементы в containerView
и установите их ограничения для контроля высоты.