2016-12-08 18 views
0

Ich habe eine benutzerdefinierte Registerkarte mit einer horizontalen Bildlaufansicht darunter. Tab-Leiste enthält 5 Schaltflächen, von denen jede eine der fünf benutzerdefinierten Tastaturen aufruft (sie befinden sich in einer Bildlaufansicht). Sie können zwischen diesen Tastaturen wechseln, indem Sie durch die Bildlaufansicht blättern oder die Tasten drücken.scrollViewDidScroll wird nicht aufgerufen

Frage: Wie ändere ich die Zustände der Tasten (Standard < -> ausgewählt), wenn ich mit der Bildlaufansicht zwischen den Tastaturen umschalte?

Visuell:

enter image description here

+0

Bitte tatsächlich geben Sie die Bildbeschreibung funktionieren - und geben Sie weitere Informationen (einschließlich Code), damit die Leute Ihnen helfen können. – GJZ

Antwort

0

Ich habe Ihr Projekt heruntergeladen und Sie haben einige Probleme dort. Sie implementieren die UIScrollViewDelegate, aber aus irgendeinem Grund ist die Methode, die Sie in Ihrer App haben falsch für die scrollViewDidScroll(_:).

Das braucht Methode, wie auf diese Weise erklärt werden:

func scrollViewDidScroll(_ scrollView: UIScrollView) {} 

Sie nichts in diesem Verfahren und in Ihrem Fall, dass Sie den Namen des Arguments als den Namen Ihres UIScrollView, eine kleinere gerade geändert ändern ändern, aber es bedeutet, dass Sie nicht jedes Mal benachrichtigt werden, wenn der UIScrollView scrollte.

Also gehen wir zurück zu Ihrem Problem. Um das zu erreichen, was Sie wünschen, Sie benötigen die aktuelle Seite zu berechnen, wo Sie innerhalb des UIScrollView oder in Ihrem Fall sind die Nummer der Taste, können wir berechnen, dass die folgende Formel:

let pageWidth = scrollView.frame.size.width 
let page = Int(round((scrollView.contentOffset.x)/(pageWidth))) 

Danach, was Sie brauchen Aktualisiert die ausgewählte Schaltfläche, wenn der Bildlauf beendet wird. Das Problem mit der Methode scrollViewDidScroll(_:) besteht darin, dass diese Methode während des Scrolling-Prozesses mehrmals aufgerufen wird. Daher benötigen wir eine Methode, die nur aufgerufen wird, wenn das Scrollen beendet ist, und es ist scrollViewDidEndDecelerating(_:).

So müssen Sie den folgenden Code im Code hinzuzufügen:

func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) { 

    let pageWidth = scrollView.frame.size.width 
    let page = Int(round((scrollView.contentOffset.x)/(pageWidth))) 

    let previousIndex = selectedIndex 
    tabBarButtons[previousIndex].isSelected = false 

    selectedIndex = page 
    tabBarButtons[page].isSelected = true 
} 

ich das Verhalten in Ihrer Anwendung getestet und funktioniert einwandfrei. Wenn Sie Probleme haben Ich habe das Projekt geändert, aber das einzige, was müssen Sie ist das obige Verfahren in Ihrem UIViewController hinzuzufügen und es sollte

Ich hoffe, dass diese Hilfe Sie

+0

@Rdk Ich kopierte Sie einfach Code und legen Sie es dort können Sie es mit dem gewünschten Namen ändern.Die Antwort ist nein, die Variable ist nur innerhalb der Funktion sichtbar. Wenn die Antwort Ihre Frage löst, nehmen Sie sie bitte an, um anderen zu helfen –

+0

Danke! Eine andere Frage - Sie erstellen und verwenden "pageWidth" statt nur scrollView.frame.size.width nur für die Klarheit, oder? – Rdk

+0

Ich habe die Konstante erstellt, um zu vermeiden, verweisen Sie jedes Mal den langen Namen der Breite der scrollView, können Sie es verwenden, wollen Sie nicht eine neue Konstante für sie –

0

UIScroll hat eine delegierte Methode namens scrollViewDidScroll. Dies wird jedes Mal aufgerufen, wenn der Benutzer scrollt. Die scrollView hat eine Eigenschaft namens contentOffset. Diese Eigenschaft sagt Ihnen genau, wie viel gescrollt wurde. Verwenden Sie diese Methode und Eigenschaft, um Ihre Logik zu verzweigen.

+0

Danke, das habe ich ausprobiert. Sieht aus, als hätte ich etwas falsch gemacht. Ich habe ein Array mit allen 5 Tab-Bar-Schaltflächen - '@IBOutlet var tabBarButtons: [UIButton]!' Dann benutze ich scrollViewDidScroll-Funktion, aber aus bestimmten Gründen funktioniert es nicht func scrollViewDidScroll (keyboardScrollView: UIScrollView) {wenn keyboardScrollView.contentOffset == CGPoint (x: 0, y: keyboardScrollView.contentOffset.y) {tabBarButtons [0] .isSelected = wahr}} Repo: github.com/Rudko/boo – Rdk

+0

Legen Sie einen Schnabelpunkt fest und überprüfen Sie, ob er tatsächlich aufgerufen wird. – HAS