Вот как я бы решил эту проблему, один из views
внутри вашего UIScrollView
- это то, что я называю containerView
, у меня есть выход к containerView
внутри моего ViewController
, например.Вот как выглядит моя иерархия в тестовом приложении:
Как вы можете видеть, у меня есть подпредставление в containerView
, и оно имеетОпределяя высоту, BottomView
- оранжевым цветом имеет ограничение по вертикали, определенное для containerView
.
Когда пользователь касается представления замены (метод replaceView(_)
в моем примере), вам просто нужно сначала удалить всеподпредставления от containerView
и затем добавьте ваш новый вид, так как мы используем автоматическую разметку, оранжевый вид всегда будет ниже представления контейнера, независимо от того, насколько большой / маленький вид контейнера ...
@IBAction func replaceView(_ sender: UIButton) {
//remove all subviews from container view to be replaced
for subview in containerView.subviews {
subview.removeFromSuperview()
}
let greenView = UIView()
greenView.translatesAutoresizingMaskIntoConstraints = false
containerView.addSubview(greenView)
NSLayoutConstraint.activate([
greenView.leadingAnchor.constraint(equalTo: containerView.leadingAnchor),
greenView.trailingAnchor.constraint(equalTo: containerView.trailingAnchor),
greenView.topAnchor.constraint(equalTo: containerView.topAnchor),
greenView.bottomAnchor.constraint(equalTo: containerView.bottomAnchor),
greenView.heightAnchor.constraint(equalToConstant: 50)
])
greenView.backgroundColor = .green
}
Еслиу вас есть представление, которое вы хотите добавить в другой Storyboard View Controller, вы можете добавить его так:
Я предполагаю, что ваш Storyboard
называется Main
и Storyboard ID для контроллера представления, который я добавляю,GreenStoryboardID
@IBAction func replaceView(_ sender: UIButton) {
//remove all subviews from container view to be replaced
for subview in containerView.subviews {
subview.removeFromSuperview()
}
let storyboard = UIStoryboard(name: "Main", bundle:nil)
let greenViewController = storyboard.instantiateViewController(withIdentifier: "GreenStoryboardID")
guard let greenView = greenViewController.view else { fatalError() }
//add view properly so it is uses UIViewController contaniment methods
addChildViewController(greenViewController)
containerView.addSubview(greenView)
greenViewController.didMove(toParentViewController: self)
greenView.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
greenView.leadingAnchor.constraint(equalTo: containerView.leadingAnchor),
greenView.trailingAnchor.constraint(equalTo: containerView.trailingAnchor),
greenView.topAnchor.constraint(equalTo: containerView.topAnchor),
greenView.bottomAnchor.constraint(equalTo: containerView.bottomAnchor),
greenView.heightAnchor.constraint(equalToConstant: 50)
])
}
От вас зависит, как вы правильно определите размер контроллера представления, здесь я просто устанавливаю его высоту равным 50, но вы можете иметь метод в вашем подклассе UIViewController
, напримеру которого есть способность позволить тебе знатькак велико должно быть представление, чтобы вместить все в представление контейнера