iOS: неотскакивающая прокрутка для стека стеков со стационарным элементом вверху

Я пытаюсь использовать Xcode IB для создания прокручиваемой группы из 16 стеков, расположенных друг над другом, с 17-м стационарным стеком вверху, который не прокручивается. Я хочу иметь возможность взаимодействовать с прокручиваемыми стеками, поэтому я не хочу, чтобы они возвращались обратно сразу после прокрутки вниз.

Любое необходимое программирование я бы сделал на Swift.

В настоящее время у меня есть:

  • a vertical stackview at the top of the view (Overview Stack View) that contains
    • one horizontal stackview at the top of the Overview Stack View as the stationary element (this horizontal stackview contains 2 text fields)
    • вид прокрутки ниже этого, который содержит UIView, который, в свою очередь, содержит 16 горизонтальных видов стека, расположенных на расстоянии 50 единиц друг от друга по оси Y.

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

Репозиторий Github здесь

На этом изображении показан проект в XCode:

проект в Xcode

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

Любая помощь будет оценена!


person user1147171    schedule 02.11.2016    source источник


Ответы (1)


Это работает для моей ситуации:

  1. Сделайте ViewController делегатом UIScrollView.
  2. Создайте выход в Main ScrollView.
  3. Добавьте код на основе этого ответа. (Я внес некоторые изменения.)

См. код для ViewController ниже (также в github).

Надеюсь, это поможет кому-то!

import UIKit

class ViewController: UIViewController, UIScrollViewDelegate {

    @IBOutlet weak var mainScroll: UIScrollView!

    let stackHeight: CGFloat = 30.0

    override func viewDidLoad() {
        super.viewDidLoad()
        mainScroll.delegate = self
        print("----- viewDidLoad -----")
        let swipeDown = UISwipeGestureRecognizer(target: self, action: #selector(ViewController.swiped(_:)))
        swipeDown.direction = UISwipeGestureRecognizerDirection.Down
        self.view.addGestureRecognizer(swipeDown)

        let swipeUp = UISwipeGestureRecognizer(target: self, action: #selector(ViewController.swiped(_:)))
        swipeUp.direction = UISwipeGestureRecognizerDirection.Up
        self.view.addGestureRecognizer(swipeUp)
    }

    func swiped(gesture: UIGestureRecognizer)
    {
        if let swipeGesture =  gesture as? UISwipeGestureRecognizer
        {
            switch swipeGesture.direction
            {
            case UISwipeGestureRecognizerDirection.Down:
                print("DOWN")
                if (mainScroll.contentOffset.y >= stackHeight) {
                    mainScroll.contentOffset.y = mainScroll.contentOffset.y - stackHeight
                }
            case UISwipeGestureRecognizerDirection.Up:
                print("UP \(mainScroll.contentOffset.y)")
                if (mainScroll.contentOffset.y <= stackHeight*16 ) {
                    mainScroll.contentOffset.y = mainScroll.contentOffset.y+stackHeight
                }
            default:
                break
            }
        }
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}
person user1147171    schedule 21.11.2016