Как установить динамическую высоту UIScrollView в Swift 4 IOS?

Если высота прокрутки не установлена. тогда прокрутка не будет прокручиваться.

Чтобы сделать его прокручиваемым. Я устанавливаю высоту статически в коде, подобном этому.

scrollView.contentSize = CGSize(width: self.view.frame.size.width, height: 1000)

Есть ли способ динамически установить высоту??


person Sajid Zeb    schedule 10.03.2018    source источник
comment
лучше всего использовать автоматическую раскладку !!   -  person Mahendra    schedule 10.03.2018
comment
Вы можете объяснить это еще немного. Спасибо   -  person Sajid Zeb    schedule 10.03.2018
comment
Используя autolayout, вам нужно указать ограничения для подвидов прокрутки, чтобы из ограничений высота содержимого прокрутки автоматически вычислялась... вам не нужно устанавливать ее явно.   -  person Mahendra    schedule 10.03.2018
comment
@MahendraGP Все зависит от требований.   -  person dahiya_boy    schedule 10.03.2018
comment
Это не зависит от требований, никто не будет жаловаться вам на то, почему вы использовали автоматические макеты или фреймы .... вам решать, с чем вы хотите работать .... и автоматические макеты теперь широко используются, чем фреймы. ..   -  person Mahendra    schedule 10.03.2018
comment
@MahendraGP Я не говорю, что вы ошибаетесь, даже если вы абсолютно правы, но возьмем случай, когда пользователь добавляет подпредставления в виде прокрутки с помощью кода. Существует множество сценариев, в которых создание пользовательского интерфейса программно еще проще, чем с помощью раскадровки. Thatsy я сказал, что это зависит от требований.   -  person dahiya_boy    schedule 10.03.2018
comment
Я понял ... но опять же, это зависит от разработчика, если он хорош в автоматической компоновке, то он может делать все то, что можно сделать с помощью фреймов.   -  person Mahendra    schedule 10.03.2018
comment
Вы должны передать все подвиды height в scrollView.contentSize.height. если там 3 ярлыка, чем lbl1.frame.size.height + lbl2.frame.size.height + lbl3.frame.size.height   -  person Kuldeep    schedule 10.03.2018
comment
CGRect contentRect = CGRectZero; для (UIView * представление в self.scrollView.subviews) { contentRect = CGRectUnion (contentRect, view.frame); } self.scrollView.contentSize = contentRect.size; Это поможет вам найти всю высоту прокрутки, включая подвиды.   -  person Mitesh Dobareeya    schedule 10.03.2018


Ответы (2)


  • Если вы хотите использовать раскадровку, сначала перейдите к это.

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

    scrollView.contentSize = CGSize(width: self.view.frame.size.width, height: contentHeight)
    

Все еще есть какие-либо вопросы, то спросите.

person dahiya_boy    schedule 10.03.2018
comment
Спасибо. Я собираюсь сделать это программно. Так как же программно рассчитать высоту внутреннего содержимого? - person Sajid Zeb; 10.03.2018
comment
@SajidZeb Как я уже сказал в комментариях, это зависит от вашего дизайна пользовательского интерфейса. и логика кода, что вы сделали и как вы сделали. - person dahiya_boy; 10.03.2018

Один из вариантов использования AutoLayout — сделать UIStackView подпредставлением UIScrollView. Установите ограничения (ведущее, конечное, верхнее, нижнее и ширина) UIStackView равными UIScrollView. Установите высоту подпредставлений (в качестве альтернативы сделайте их динамическими для изменения размера в зависимости от их собственных подпредставлений). Затем добавьте подпредставления в UIStackView с помощью addArrangedSubview, и он обработает ограничения за вас. ContentSize UIScrollView будет адаптироваться к UIStackView в зависимости от его подвидов.

Не забудьте изменить свойство оси UIStackView на вертикальное.

Вот пример использования NSLayoutAnchor:

override func loadView() {
    let view = UIView()
    view.backgroundColor = .white

    let redView = UIView()
    redView.backgroundColor = .red
    redView.translatesAutoresizingMaskIntoConstraints = false
    NSLayoutConstraint.activate([
        redView.heightAnchor.constraint(equalToConstant: 400.0)
    ])

    let blueView = UIView()
    blueView.backgroundColor = .blue
    blueView.translatesAutoresizingMaskIntoConstraints = false
    NSLayoutConstraint.activate([
        blueView.heightAnchor.constraint(equalToConstant: 700.0)
    ])

    let scrollView = UIScrollView()
    scrollView.backgroundColor = .black
    scrollView.translatesAutoresizingMaskIntoConstraints = false
    view.addSubview(scrollView)
    NSLayoutConstraint.activate([
        scrollView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
        scrollView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
        scrollView.topAnchor.constraint(equalTo: view.topAnchor),
        scrollView.bottomAnchor.constraint(equalTo: view.bottomAnchor)
    ])

    let stackView = UIStackView()
    stackView.axis = .vertical
    stackView.translatesAutoresizingMaskIntoConstraints = false
    stackView.addArrangedSubview(redView)
    stackView.addArrangedSubview(blueView)
    scrollView.addSubview(stackView)
    NSLayoutConstraint.activate([
        stackView.leadingAnchor.constraint(equalTo: scrollView.leadingAnchor),
        stackView.trailingAnchor.constraint(equalTo: scrollView.trailingAnchor),
        stackView.topAnchor.constraint(equalTo: scrollView.topAnchor),
        stackView.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor),
        stackView.widthAnchor.constraint(equalTo: scrollView.widthAnchor)
    ])

    self.view = view
}

Если вы не хотите использовать UIStackView, просто добавьте каждое подпредставление непосредственно в UIScrollView и задайте ограничения, как они соотносятся друг с другом.

person billgert    schedule 10.03.2018