2017-05-19 6 views
0

Ich möchte herausfinden, welche Seite für den Benutzer sichtbar ist und auch eine bestimmte Aktion ausführen, wenn eine Änderung der Seite erkannt wird. Dazu benutze ich die Funktion scrollViewDidScroll. Da ich das Ergebnis nicht bekommen habe (nichts ist passiert), habe ich nach Antworten auf stackoverflow gesucht und folgende Frage gefunden, die beantwortet wurde: Detecting UIScrollView page change, um genau zu sein habe ich die Antwort von Michael Waterfall benutzt und den Objective-C-Code konvertiert zu schnellem Code.Erkennen, wenn y Offset Änderungen in scrollView mit Paging aktiviert

Unten finden Sie den Code, den ich verwendet habe, um die scrollView in meinem class HomeController: UIViewController, UIScrollViewDelegate { zu erstellen. Außerdem wird die Funktion von Michael Waterfall in der Funktion initiateScrollView() deklariert und aufgerufen. Die Funktion druckt jedoch nichts. Weißt du, wo ich etwas falsch mache? Ich kann nicht sehen, wo ich einen Fehler gemacht habe. Beim Scrollen passiert nichts (z. B. von Seite 1 bis Seite 2 (homeView bis view2)). Die Funktion druckt nur einmal before: 0 und danach passiert nichts.

-Code

override func viewDidLoad() { 

    super.viewDidLoad() 
    view.backgroundColor = .white 

    initiateScrollView() 

} 

func initiateScrollView() { 

    //create scrollView with paging enabled 
    let scrollView = UIScrollView(frame: view.bounds) 
    scrollView.isPagingEnabled = true 
    view.addSubview(scrollView) 

    //get page size 
    let pageSize = view.bounds.size 

    //individual views 
    let homeView = UIView() 
    homeView.backgroundColor = .green 

    let view2 = UIView() 
    view2.backgroundColor = .blue 

    let view3 = UIView() 
    view3.backgroundColor = .red 

    //array with individual views 
    let pagesViews = [homeView, view2, view3] 

    //amount of views 
    let numberOfPages = pagesViews.count 
    print(numberOfPages) //prints '3' 

    //add subviews (pages) 
    for (pageIndex, page) in pagesViews.enumerated(){ 

     //add individual pages to scrollView 
     page.frame = CGRect(origin: CGPoint(x:0 , y: CGFloat(pageIndex) * pageSize.height), size: pageSize) 
     scrollView.addSubview(page) 

    } 

    func scrollViewDidScroll(scrollView: UIScrollView) { 

     var previousPage = 0 
     let fractionalPage: Float = Float(scrollView.contentOffset.y/pageSize.height) 
     let page = lround(Double(fractionalPage)) 

     print("before:", page) //prints 'before: 0' once 

     if previousPage != page { 

      // Page has changed, do your thing! 
      // ... 
      // Finally, update previous page 
      print("before:", page) 
      previousPage = page 
      print("after:", page) 

     } //never prints anything 

    } 

    scrollViewDidScroll(scrollView: scrollView) 

    //define size of scrollView 
    scrollView.contentSize = CGSize(width: pageSize.width, height: pageSize.height * CGFloat(numberOfPages)) 
} 

Antwort

0

Dies ist, weil Sie nicht den Delegaten Eigenschaft Ihres Scroll gesetzt haben. Fügen Sie in Ihrer initiateScrollView-Methode scrollView.delegate = self hinzu.

+0

Nein, anscheinend ist es verwenden nicht, das hat nicht funktioniert. – Moritz

1

Sie haben vergessen, die Viewcontroller als Delegierter für die Scroll-Ansicht zu setzen, wie folgend:

func initiateScrollView() { 

//create scrollView with paging enabled 
let scrollView = UIScrollView(frame: view.bounds) 
scrollView.isPagingEnabled = true 
scrollView.delegate = self 
view.addSubview(scrollView) 
(...) } 

Und ich empfehle, dass Sie die scrollViewDidEndScrollingAnimation(_ scrollView: UIScrollView) Funktion, statt scrollViewDidScroll(...)

+0

Nein, es wird immer noch nichts gedruckt. – Moritz

+0

Sie sollten die Standalone-Zeile 'scrollViewDidScroll (scrollView: scrollView)' (vor der'contentSize'-Anweisung) löschen und die Funktion 'func ScrollViewDidScroll (...) {...}' entfernen und in die viewController-Klasse einfügen. nicht in der 'initiateScrollView()' Funktion. Vergessen Sie nicht, auch den Delegierten festzulegen. –

+0

Aber dann müsste ich 'pageSize.height' global machen, oder? – Moritz

Verwandte Themen