Frage

Skype App für das iPhone verwendet animierte TabBar Icons. Zum Beispiel zirkuliert während der Protokollierung in der äußersten rechten Tabulatorsymbol zeigen Pfeile. Während den Aufruf der „Call“ Tabulatorsymbol leise blinkt, die offensichtlich durch Animation durchgeführt wird.

Ich frage mich, wie es möglich ist zu animieren Tableiste Elemente Symbole.

In meinem speziellen Fall, wenn der Benutzer die ‚Favorite‘ Taste springt er auf den Tab-Leiste Punkt ‚Favoriten‘. Ich habe bereits die Sprung Animation umgesetzt, aber ich würde, um das Gefühl der Vollständigkeit, um es am Ende der Animation das entsprechenden Tab-Leiste Symbol zu blinken will.

Irgendwelche Vorschläge über die Richtung, ich sehe in sollte?

Vielen Dank im Voraus.

War es hilfreich?

Lösung

Ich bin überrascht, wie einfach die Lösung!

Add-Methode in Ihrer Anwendung Delegate-Klasse .m-Datei (oder jede andere Klasse, die Ihre UITabBar verwalten) enthält die folgende Routine:

  1. Geben Sie eine UIImageView erstellen, die für die Animation verwendet werden.
  2. Fügen Sie es zu Ihrem TabBar- Ansicht, welche die addSubview: Methode.
  3. Rahmen es auf die Größe des UITabBarItem nach unten (Verwendung UITabBar Rahmengröße und die Anzahl der Tab-Leiste Elementen der Rahmengröße zu berechnen).
  4. Stellen Sie den frame.origin.x Wert des Imageview das Bild nach rechts über die Registerkarte Schläger Artikel zu platzieren, die Sie animieren möchten.
  5. Fügen Sie Animation, die Sie auf die Imageview wollen (Sie mit Opazität spielen können, tauschen Sie mehrere Bilder - alles, was Sie wollen)
  6. .

Ziemlich einfach, nicht denken Sie so?

Sie können diese Methode aufrufen, auf UIApplicationDelegate Instanz überall müssen Sie die Tab-Leiste Element animieren.

Auch ist es wichtig zu bemerken, dass Sie durch die Imageview tippen können das Tab-Leiste Element auszuwählen, als ob es kein Bild über die Tab-Leiste war. Viele interessante Schlüsse können hier durchgeführt werden, was Sie tun können, wenn Sie es wissen ...

Andere Tipps

Ich habe eine bessere Lösung für dieses Problem gefunden. Hinzufügen Ansicht benutzerdefinierte Bild ist nicht ein besserer Ansatz, weil in iOS 10.0 und später mit der Ausrichtung auf das Symbol Rahmen & Textposition geändert. Sie müssen nur die Klasse von UITabBarController setzen und den folgenden Code setzen.

override func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) {

    let index = self.tabBar.items?.index(of: item)
    let subView = tabBar.subviews[index!+1].subviews.first as! UIImageView
    self.performSpringAnimation(imgView: subView)
}

//func to perform spring animation on imageview
func performSpringAnimation(imgView: UIImageView) {

    UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 0.5, initialSpringVelocity: 0.5, options: .curveEaseInOut, animations: {

        imgView.transform = CGAffineTransform.init(scaleX: 1.4, y: 1.4)

        //reducing the size
        UIView.animate(withDuration: 0.5, delay: 0.2, usingSpringWithDamping: 0.5, initialSpringVelocity: 0.5, options: .curveEaseInOut, animations: {
            imgView.transform = CGAffineTransform.init(scaleX: 1, y: 1)
        }) { (flag) in
        }
    }) { (flag) in

    }
}  

Beachten Sie, dass die Reihenfolge der Subviews im UITabBar ungeordneten sein kann, das richtige Element von ihm so dem Zugriff auf einen Index möglicherweise nicht richtig arbeiten, als Naresh Antwort vorgeschlagen. Werfen Sie einen Blick auf diesen Beitrag UITabBar Subviews Änderungsauftrag

Die Lösung I ist zum ersten Filter und sortiert die Ansichten und dann Zugriff auf den korrekten Index des tabBarItem verwendet wird.

override func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) {

    let orderedTabBarItemViews: [UIView] = {
        let interactionViews = tabBar.subviews.filter({ $0 is UIControl })
        return interactionViews.sorted(by: { $0.frame.minX < $1.frame.minX })
    }()

    guard
        let index = tabBar.items?.index(of: item),
        let subview = orderedTabBarItemViews[index]?.subviews.first
    else {
        return
    }

    performSpringAnimation(for: subview)
}

func performSpringAnimation(for view: UIView) {
    UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 0.5, initialSpringVelocity: 0.5, options: .curveEaseInOut, animations: {
        view.transform = CGAffineTransform(scaleX: 1.25, y: 1.25)
        UIView.animate(withDuration: 0.5, delay: 0.2, usingSpringWithDamping: 0.5, initialSpringVelocity: 0.5, options: .curveEaseInOut, animations: {
            view.transform = CGAffineTransform(scaleX: 1, y: 1)
        }, completion: nil)
    }, completion: nil)
}
scroll top