Переключите Контейнер или Вид с другой высотой в пределах прокрутки - PullRequest
0 голосов
/ 26 апреля 2018

Я пытаюсь разместить другой вид с разной высотой в пределах прокрутки одним нажатием кнопки.Я рисую изображение проблемы:

enter image description here

Если вы нажмете кнопку 1 (btn1), то мы загрузим представление 1. Если вы нажмете кнопку 2, то мызагрузить представление 2.

Есть виджеты над кнопками и под отображаемым видом.Так что отображаемое представление должно иметь динамическую высоту, которая не будет влиять на другие элементы внутри прокрутки.Я пробовал container_views, но не могу установить соединение с контроллерами представления разной высоты.

ОБНОВЛЕНИЕ: (вот еще один пример)

enter image description here

1 Ответ

0 голосов
/ 26 апреля 2018

Вот как я бы решил эту проблему, один из views внутри вашего UIScrollView - это то, что я называю containerView, у меня есть выход к containerView внутри моего ViewController, например.Вот как выглядит моя иерархия в тестовом приложении:

Hierarchy

Как вы можете видеть, у меня есть подпредставление в 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, напримеру которого есть способность позволить тебе знатькак велико должно быть представление, чтобы вместить все в представление контейнера

...