通常のiphoneタブバーでは提供できないタブバーにはいくつかの要件があるため、自分自身でビルドする必要があります。iPhone:自分でTabBarを作成するにはどうしたらいいですか?
私の独自のタブバーを作成する最良の方法、具体的には、サブビューのメモリとベストプラクティスを考慮しながら、メインビューコントローラのビューを適切な方法で追加/削除(表示/非表示)する方法はありますか?
通常のiphoneタブバーでは提供できないタブバーにはいくつかの要件があるため、自分自身でビルドする必要があります。iPhone:自分でTabBarを作成するにはどうしたらいいですか?
私の独自のタブバーを作成する最良の方法、具体的には、サブビューのメモリとベストプラクティスを考慮しながら、メインビューコントローラのビューを適切な方法で追加/削除(表示/非表示)する方法はありますか?
他のところで述べたように、それはほぼです。UIKit
によって提供されるコアナビゲーションクラスを削除することをお勧めします。完全なカスタムタブバークラスのメリットと思われるアプリケーション要件のタイプは何ですか?レイヤーをサブクラス化、分類、または使用することによって、必要なカスタマイズを達成することはほぼ常に可能です。
UPDATE 1:これは、カスタムタブバーの実装を取得するために私のアプリのいくつかで行ったことです。
-updateTabBarImageForViewControllerIndex:
UITabBar
-tabBarController:shouldSelectViewController:
を実装し、カスタムタブバーサブクラスで-updateTabBarImageForViewControllerIndex:
を呼び出します。基本的に、タブバーコントローラがView Controllerを切り替えるたびに、タブバーサブクラスに通知する必要があります。このような場合は、タブバーのどの画像を選択する必要があるかを判断します。タブバーの画像はn
、各タブの選択状態の画像は1つです。 UITabBarItem
の実装を実際に見開いて個々の画像で作業することは可能ですが、もう少し作業があります。
// MyAppDelegate.m
- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController
{
// Determine the index based on the selected view controller
NSUInteger viewControllerIndex = ...;
[(MyTabBar *)tabBarController.tabBar updateTabBarImageForViewControllerIndex:viewControllerIndex];
return YES;
}
// MyTabBar.m
- (void)updateTabBarImageForViewControllerIndex:(NSUInteger)index
{
// Determine the image name based on the selected view controller index
self.selectedTabBarImage = [UIImage imageNamed:...];
[self setNeedsDisplay];
}
- (void)drawRect:(CGRect)rect
{
CGContextDrawImage(UIGraphicsGetCurrentContext(), rect, self.selectedTabBarImage.CGImage);
}
UPDATE 2:今、私はもっとそれについて考えることを、あなたは実際に(とすべきである)あなたがすべてでUITabBar
をサブクラス化せずに達成しようとしているもので逃げることができました。インポート<QuartzCore/QuartzCore.h>
とレイヤーのコンテンツを活用してください。 :)
// MyAppDelegate.m
- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController
{
// Determine the image name based on the selected view controller
CGImageRef newTabBarImageRef = [[UIImage imageNamed:...] CGImage];
tabBarController.tabBar.layer.contents = (id)newTabBarImageRef;
return YES;
}
本当にアプリケーションによって異なります。タブバーに割り当てられているすべてのビューコントローラをメモリ内に保持することができれば、適切なビューコントローラをすべて格納する単純な配列を使用して、その配列のインデックスを使用して表示できます。 独自のタブバーイメージ(および/またはタイトル)を保存するカスタムビューコントローラを作成することもお勧めします。あなたのタブバーはそこからすべての価値を取ります。
あまりにも多くのメモリを用意することはできませんが(それほど可能ではありません)、アレイにNSDictionaryを保存し、コントローラを表示することはできません。また、ユーザがタブバーアイテムをタップすると、前のビューコントローラをアンロードして、その辞書のパラメータを使用して新しいビューコントローラを作成するだけです。また、辞書の代わりにカスタムコンテナクラスを使用することもできます。
通常のUITabBarはすべてのビューをメモリにロードしますか? –
docsから - (void)setViewControllers:(NSArray *)viewControllers animated:(BOOL)animatedまずビューコントローラを作成する必要があります。 – Max
あなたは自分のタブバー(コントローラ)を作って、すでにUIKitによって達成されている作業の95%を実際にやっています。単純なサブクラス化やレイヤーコンテンツの操作で5%の作業を行うのはなぜですか? – LucasTizma
この2つの回答は、iOS5で解消されました。私が代わりにやったことは、カスタムタブバーサブクラスを維持し、そのままこの方法だけを残していた:
- (void)drawRect:(CGRect)rect
{
CGContextDrawImage(UIGraphicsGetCurrentContext(), rect, nil);
}
次にMainWindow.xibで、私は、タブバーなどの背景とUIButtonsなどImageViewのでカスタムビューを作成しましたアイテム。
TabControllerデリゲートでは、ボタンの選択状態を更新します。
- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController
{
// Determine the index based on the selected view controller
UIButton *newBtn;
if(viewController == homeVC) {
...
}
// Update the buttons
newBtn.selected = YES;
_selectedTabBtn.selected = NO;
_selectedTabBtn = newBtn;
return YES;
}
iOS5では、タブバーをカスタマイズすることができるので、これはもう問題ではありません。 –
新しい文書へのリンクがありますか? UITabBarItem、UITabBar、またはUITabBarControllerで何も見つかりませんでした。 – oohaba
新しいbackgroundImage、selectedImageTintColor、selectionIndicatorImage、およびtintColorプロパティがあります。 XCode 4.2のドキュメントを見ると、iOS 5ライブラリに表示されます。 –
実際、UITabBar [Controller]に関して、Appleは本当にあなたがそれをサブクラス化したくないのです。それはできますが、しばしば彼らがあなたにそれをやめるのを止めるために持ってきたassert()の束に失敗します。私がdevフォーラムでそれについて尋ねたとき、答えは "あなたのロール"でした。 (起こったように、私はしませんでしたが、途中で痛みや苦しみがありました) –
'-drawRect:'をオーバーライドしてスタイルをカスタマイズするだけであれば、サブクラス化には何も問題ありません。はい、基礎となるロジックを変更するメソッドをオーバーライドすることは望ましくありませんが、適切に行っている場合は、サブクラス化に害はありません。どんな場合でも、できるだけレイヤーを使用することをお勧めします。サブクラスやカテゴリの必要はありません。ルーカス。 – LucasTizma
。オーバーレイの色とテキストの色を変更する必要があります。私が見たことから、これを行うとアプリが拒否される可能性があります。 –