uitabbaritemアイコンアニメーション
-
29-09-2019 - |
質問
iPhone用のSkypeアプリは、アニメーションのTabbarアイコンを使用しています。たとえば、ロギング中の右端のタブアイコンは、循環矢印を示しています。 「呼び出し」タブアイコンを呼び出している間、アニメーションを通じて明らかに行われる柔らかく点滅します。
Tab Barアイテムのアイコンをアニメーション化することはどのように可能だろうかと思います。
私の特定のケースでは、ユーザーが「お気に入り」ボタンを押すと、「お気に入り」のタブバーアイテムにジャンプします。私はすでにジャンプアニメーションを実装していますが、対応するタブバーアイコンがアニメーションの最後に点滅して、完全性の感覚をもたらしたいと思います。
私が見るべき方向について何か提案はありますか?
前もって感謝します。
解決
解決策がどれほど簡単かに驚いています!
次のルーチンを含む。
- アニメーションに使用されるuiimageViewを作成します。
- を使用してタブバービューに追加します
addSubview:
方法。 - UITABBARITEMのサイズまでフレームダウンします(UITABBARフレームサイズとタブバーアイテムの数を使用して、フレームサイズを計算します)。
- ImageViewを調整します
frame.origin.x
アニメーション化するタブバットアイテムのすぐ上に画像を配置する値。 - 画像ビューにアニメーションを追加します(不透明度で再生でき、複数の画像を交換できます - 必要なものは何でも)。
かなり簡単だと思いませんか?
このメソッドは、uiapplicationdelegateインスタンスで、タブバーアイテムをアニメーション化するために必要な場所に呼び出すことができます。
また、ImageViewをタップして、タブバーの上に画像がないかのようにタブバーアイテムを選択できることに注意することが重要です。多くの興味深い結論は、あなたがそれを知っていればあなたができることについてここで行うことができます...
他のヒント
この問題のより良い解決策を見つけました。 iOS 10.0では、方向の変更時にアイコンフレームとテキストの位置が変更されたため、カスタム画像ビューの追加はより良いアプローチではありません。 UitabbarControllerのクラスを設定し、次のコードを配置するだけです。
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
}
}
uitabbarのサブビューの順序は順序付けられていないため、インデックスを使用してそこから正しいアイテムにアクセスすることは正しく機能しない場合があることに注意してください。 ナレシュの答え 提案された。この投稿をご覧ください UITABBARサブビューは順序を変更します
私が見つけた解決策は、最初にビューをフィルタリングして並べ替えてから、Tabbaritemの正しいインデックスを使用してアクセスすることです。
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)
}
私はそれをしていませんが、カバシカニメーションを使用してカアン化を作成しようとし、アニメーション化したいuitabbaritemに追加しようとします。
カバシカン化のセットアップ方法の詳細については、コアアニメーションプログラミングガイドを参照してください。http://developer.apple.com/mac/library/documentation/cocoa/conceptual/coreanimation_guide/articles/animatinglayers.html#//apple_ref/doc/uid/tp40006085-sw1
Tabbarアイコンをアニメーション化して、そのビューを取得し、Uiviewに好きなようにアニメーションを実行できます。以下は、スケール変換の簡単な例です。
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
}
})
}
}
PS:各uitabbaritemのタグを順番に割り当ててください