Как да зададете динамично UIScrollView височина в Swift 4 IOS?

Ако височината на scrollview не е зададена. тогава scrollview няма да може да се превърта.

За да може да се превърта. Зададох височина статично в код като този.

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
Използвайки автоматично оформление, трябва да дадете ограничения на подизгледите на scrollview, така че от ограниченията височината на съдържанието на scrollview да се изчислява автоматично... не е необходимо да го задавате изрично.   -  person Mahendra    schedule 10.03.2018
comment
@MahendraGP Всичко зависи от изискването.   -  person dahiya_boy    schedule 10.03.2018
comment
Не зависи от изискването, никой няма да ви се оплаче, че защо сте използвали автоматични оформления или рамки....от вас зависи с какво искате да отидете....а автоматичните оформления вече се използват широко от рамките. ..   -  person Mahendra    schedule 10.03.2018
comment
@MahendraGP Не казвам, че грешите, дори сте абсолютно прав, но вземете случай, когато потребителят добавя подизгледи в scrollview чрез работа на код. Има много сценарии, при които правенето на UI от програмно е дори по-лесно, отколкото чрез сценарий. Това казах, че зависи от изискванията.   -  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; Това ще ви помогне да намерите цялата височина на scrollview, включваща неговите подизгледи.   -  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