UITabBarItem Icon-Animation
-
29-09-2019 - |
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.
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:
- Geben Sie eine UIImageView erstellen, die für die Animation verwendet werden.
- Fügen Sie es zu Ihrem TabBar- Ansicht, welche die
addSubview:
Methode. - 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).
- 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. - 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) .
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)
}
Ich habe nicht getan, aber ich würde nur eine CAAnimation zu bauen versuchen, z.B. mit einem CABasicAnimation und fügen Sie es dem UITabBarItem Sie animiert werden soll.
Weitere Informationen dazu, wie ein CABasicAnimation sieht die Core Animation Programming Guide einzurichten:
Sie können Tabbar Symbole animieren, indem Sie seine Ansicht bekommen, dann tun, was Animation, wie Sie möchten für die UIView. Im Folgenden finden Sie ein einfaches Beispiel mit Skala verwandeln, jubelt! ps: bitte assign-Tag für jede UITabBarItem um func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem){
var tabBarView: [UIView] = []
for i in tabBar.subviews {
if i.isKind(of: NSClassFromString("UITabBarButton")! ) {
tabBarView.append(i)
}
}
if !tabBarView.isEmpty {
UIView.animate(withDuration: 0.15, animations: {
tabBarView[item.tag].transform = CGAffineTransform(scaleX: 1.2, y: 1.2)
}, completion: { _ in
UIView.animate(withDuration: 0.15) {
tabBarView[item.tag].transform = CGAffineTransform.identity
}
})
}
}