Проблема ScrollView со встроенным StackView

#xcode #constraints #scrollview #stackview

#xcode #ограничения #scrollview #stackview

Вопрос:

У меня есть scrollView с stackView размещенным в нем. scrollView Ограничено rootview . В представлении стека будет отображаться представление xib.

Все представления xib имеют разную длину. Представления xib помечены simpleVC0 и simpleVC1 . Длина simpleVC0 равна 2500, а длина simpleVC1 равна 1000.

Моя проблема заключается в том, что когда представления xib представлены в представлении стека, длина scrollView не изменяется на длину представленного представления xib. Похоже, что представлен вид xib, но вид прокрутки заблокирован на определенной длине.

Вот simpleVC0 представление xib. за ним следует при запуске. Когда я пытаюсь прокрутить, это не позволяет мне прокручивать до нижней части представления xib. кажется, что представление xib отключается на определенной длине. Я прав, говоря, что, возможно, это проблема, которую, возможно, придется решать в коде? или это может быть решено из-за ограничений. Я пробовал ограничения автоматической компоновки, однако они не сработали.

введите описание изображения здесь

введите описание изображения здесь
Пример того, как далеко я могу прокручивать (обратите внимание, что вид xib отключен, поскольку он показывает только определенное количество зеленого цвета.)
введите описание изображения здесь

введите описание изображения здесь

Я ограничил scrollView rootview со всех четырех сторон. При загрузке корневого представления xibs устанавливаются с использованием следующего кода:

     //Different subViews for ingredients and steps
    if counter == 0 {
        simpleViewX = SimpleVC0().view
        simpleViewY = SimpleVC1().view
        stack.addArrangedSubview(simpleViewX)
        stack.addArrangedSubview(simpleViewY)
    }
  

Представления являются скрытыми, отображаемыми путем изменения значения контроллера сегментированного представления. Показано ниже:

     @IBAction func tabselected(_ sender: Any) {
    switch (sender as AnyObject).selectedSegmentIndex {
    case 0:
        simpleViewY.isHidden = true
        simpleViewX.isHidden = false

        break
    case 1:
        simpleViewX.isHidden = true
        simpleViewY.isHidden = false

        break
    case 2:
        //calledvideo in array is the value of the counter.
        calledVideo = vids[counter]
        geturl()
        break
    default:
        break
    }
    }
  

Комментарии:

1. Покажите, как вы загружаете содержимое xib.

2. @DonMag просто обновил его там, чтобы показать, как вызываются xibs.

Ответ №1:

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

При размещении в storyboard задайте для stack view ограничение по высоте (чтобы удовлетворить требованиям IB), но присвоите этому ограничению по высоте низкий приоритет.

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

Вот полный пример, основанный на показанных вами изображениях:https://github.com/DonMag/XIBsInScrollView

Комментарии:

1. Спасибо, мой друг, ты не понимаешь, как сильно ты помог. Мне потребовалось два дня, чтобы поиграть с этим, без шуток. Еще раз спасибо, ценю это.

Ответ №2:

Вы должны изменить свойство contentSize вашего ScrollView в коде. Я не знаю, как справиться с этим с помощью раскадровок, но вы можете создать выход из своего ScrollView и вычислять новую высоту при каждом ее изменении (каждый раз, когда вы что-то добавляете или удаляете что-то в нем)

 scrollView.contentSize = CGSize(width:yourNewW, height:yourNewH)
  

Комментарии:

1. Лучше использовать автоматическую компоновку и ограничения.

2. Честно говоря, я отказался от смешивания ScrollView с автозапуском, каждый раз, когда я пытался, это был кошмар ошибок. С моей точки зрения, гораздо точнее и эффективнее вычислять старые простые координаты при работе с содержимым scrollview