iOSカスタムUITTabBarとレイアウト
整理した文章iOSプロジェクト基本フレーム構築では、TabBarItemの画像属性と文字属性をカスタマイズする方法を詳しく説明した。しかし、多くの場合、私たちはTabBarItemの写真と文字の属性を修正する必要があります。また、TabBarItemの位置をカスタマイズする必要があります。このように、システムが持っているTabBarのスタイルはプロジェクトのニーズを満たすことができません。例えば、新浪微博アプリの底のtabのitemは自分の持っているTabBarItemでは実現できません。一番真ん中の【+】マイクロブログはtabを切り替えるためのものではなく、現在のページで編集発表ページをカバーし、発表が完了したり、キャンセルしたりした後、また前のページに戻ってきます。真ん中にTabBarの空間を空けて、この「+」リリースボタンを配置します。
私達のプロジェクトは“百思不姐”アプリを書く機能モジュールを真似て学習してアップするので、そのTabBarのスタイルは微博のスタイルとほぼ似ています。(図の右の図のように)、真ん中のTabボタンも帖機能です。直接現在のページで編集発表ページをカバーして、発表が完了したかそれともキャンセルした後にまた前のページに戻ります。切り替えはしていません。
ソリューション
新浪微博と私達のプロジェクトの中のこのような状況に対して、二つの解決の考えがあります。
5つのTabBarItemを定義して、TabBarにTabBarItemなどのサイズのリリースボタンを追加して、真ん中にクリックします。このように大きさが等しいので、最新のボタンは真ん中のTabBarItemを完全にカバーしています。真ん中のTabBarItemの応答イベントも遮断されます。 layoutSubview 方法は、4つのTabBarItemのレイアウトとサイズを変更し、中間を空にして、カスタマイズした「リリース」ボタンを追加して、イベントをクリックすれば、コントロールのシナリオをカバーすることができます。
この案の考えは上ですでに述べました。つまり、まず一つの位置を占めて、一つのボタンでその上に覆います。主な欠点は位置とコントローラを申請して、位置を占めるのがもったいないことです。また、このようなコントロールの大きさが均一な場合にも適用されます。私たちが必要としている各TabBarItemの規格とサイズが違ったら、このような方案を使うことができません。
いくつかの点について説明するべきです。
UITabBarItemのすべての文字属性を設定することは、前の記事iOSプロジェクト――基本フレーム構築ですでに述べられていますが、ここでは「リリース」ボタンの初期化は一例モードを使用して作成すべきです。私たちのプロジェクトには「リリース」ボタンが一つしかないので、一例モードがより合理的であり、ここでは怠惰負荷方式で単一モードの作成が行われます。 view Willapear: に【リリース】ボタンを追加します。 [self.tabbar addSubview:self.publishButton; 。なぜですか? view Willapear: に【投稿】ボタンを追加します。 view DidLoad に追加しますか?根本的な原因はTabBarItemがTabBarにロードしたのは view DidLoad 後に実行されたのは、第2部分で検証された点であり、 前の文章で私達はtabracontrollerはコントローラを作る時にviewdidLoadをロードすると言いました。ですから、「リリース」ボタンを追加すると、view DidLoadに「リリース」ボタンがTabBarに最初に追加されます。そうすると、「リリース」ボタンはTabBarItemに上書きされます。
TabBarをカスタマイズして、TabBarの各サブコントロールの属性と配置を完全に私たちのニーズに合わせて配置してもいいです。
【投稿】ボタンの初期化は上記と同じです。単例モードで初期化するべきです。具体的には展開しません。書き換える layoutSubview メソッドの場合は、先に親のタイプを呼び出すべきです。 [super layout Subview; ,このように、まずTabBarItemをレイアウトし、その後、このレイアウトに基づいてレイアウト調整を行うことができる。親の配置方法を呼び出した文は後ろに置いてはいけません。この方法はTabBarItemをレイアウトする以外にも多くの他の構成があります。通過する self.subview 現在のサブコントロールを取得するには、まず印刷して現在のサブコントロールの種類と数を知ることができます。その後、適切なフィルタリングを行います。私たちは基本的にここでKVCの方法を使って、現在のTabBarを変更します。 [self setValue:[[XMGTbar alloc]init]forKeyPath:@「tabBar」 ,属性とメンバー変数の取得方法については、runtime属性とメンバー変数を取得します。を参照してください。
3赤点ヒントを追加します
今、多くのアプリのTabBarItemは新しいニュースがある時、右上に赤いヒントがあります。ある時は具体的な数の注意があります。私達がよく使うQQ、微信、微博、頭条などのような機能があります。このヒントはiOSの中の学名はbadgeといいます。iOSのTabBarItemにはこの属性とコントロールが備わっています。自分のニーズに合わせて設定できます。下図はiOS 11のプロファイルです。ヒントの数、色をカスタマイズできます。ヒントの文字の属性は異なる状態で設定できます。
iOS 10の前ではbadgeの提示色は設定できないと言われていますが、必要ならばカスタムTabBarItemを行って、カスタマイズしたbadgeを設定するしかないです。本文はこの点について詳しく説明しません。必要な仲間がいれば、自分で助けを求めてください。
私達のプロジェクトは“百思不姐”アプリを書く機能モジュールを真似て学習してアップするので、そのTabBarのスタイルは微博のスタイルとほぼ似ています。(図の右の図のように)、真ん中のTabボタンも帖機能です。直接現在のページで編集発表ページをカバーして、発表が完了したかそれともキャンセルした後にまた前のページに戻ります。切り替えはしていません。
ソリューション
新浪微博と私達のプロジェクトの中のこのような状況に対して、二つの解決の考えがあります。
5つのTabBarItemを定義して、TabBarにTabBarItemなどのサイズのリリースボタンを追加して、真ん中にクリックします。このように大きさが等しいので、最新のボタンは真ん中のTabBarItemを完全にカバーしています。真ん中のTabBarItemの応答イベントも遮断されます。 layoutSubview 方法は、4つのTabBarItemのレイアウトとサイズを変更し、中間を空にして、カスタマイズした「リリース」ボタンを追加して、イベントをクリックすれば、コントロールのシナリオをカバーすることができます。
この案の考えは上ですでに述べました。つまり、まず一つの位置を占めて、一つのボタンでその上に覆います。主な欠点は位置とコントローラを申請して、位置を占めるのがもったいないことです。また、このようなコントロールの大きさが均一な場合にも適用されます。私たちが必要としている各TabBarItemの規格とサイズが違ったら、このような方案を使うことができません。
いくつかの点について説明するべきです。
UITabBarItemのすべての文字属性を設定することは、前の記事iOSプロジェクト――基本フレーム構築ですでに述べられていますが、ここでは「リリース」ボタンの初期化は一例モードを使用して作成すべきです。私たちのプロジェクトには「リリース」ボタンが一つしかないので、一例モードがより合理的であり、ここでは怠惰負荷方式で単一モードの作成が行われます。 view Willapear: に【リリース】ボタンを追加します。 [self.tabbar addSubview:self.publishButton; 。なぜですか? view Willapear: に【投稿】ボタンを追加します。 view DidLoad に追加しますか?根本的な原因はTabBarItemがTabBarにロードしたのは view DidLoad 後に実行されたのは、第2部分で検証された点であり、 前の文章で私達はtabracontrollerはコントローラを作る時にviewdidLoadをロードすると言いました。ですから、「リリース」ボタンを追加すると、view DidLoadに「リリース」ボタンがTabBarに最初に追加されます。そうすると、「リリース」ボタンはTabBarItemに上書きされます。
#import "XMGTabBarController.h"
@interface XMGTabBarController ()
/** */
@property (nonatomic, strong) UIButton *publishButton;
@end
@implementation XMGTabBarController
#pragma mark -
- (void)viewDidLoad {
[super viewDidLoad];
/**** UITabBarItem ****/
UITabBarItem *item = [UITabBarItem appearance];
//
NSMutableDictionary *normalAttrs = [NSMutableDictionary dictionary];
normalAttrs[NSFontAttributeName] = [UIFont systemFontOfSize:14];
normalAttrs[NSForegroundColorAttributeName] = [UIColor grayColor];
[item setTitleTextAttributes:normalAttrs forState:UIControlStateNormal];
//
NSMutableDictionary *selectedAttrs = [NSMutableDictionary dictionary];
selectedAttrs[NSForegroundColorAttributeName] = [UIColor darkGrayColor];
[item setTitleTextAttributes:normalAttrs forState:UIControlStateSelected];
/**** ****/
[self setupOneChildViewController:[[UITableViewController alloc] init] title:@" " image:@"tabBar_essence_icon" selectedImage:@"tabBar_essence_click_icon"];
[self setupOneChildViewController:[[UITableViewController alloc] init] title:@" " image:@"tabBar_new_icon" selectedImage:@"tabBar_new_click_icon"];
//
[self setupOneChildViewController:[[UIViewController alloc] init] title:nil image:nil selectedImage:nil];
[self setupOneChildViewController:[[UIViewController alloc] init] title:@" " image:@"tabBar_friendTrends_icon" selectedImage:@"tabBar_friendTrends_click_icon"];
[self setupOneChildViewController:[[UITableViewController alloc] init] title:@" " image:@"tabBar_me_icon" selectedImage:@"tabBar_me_click_icon"];
}
/**
* viewWillAppear: ?
* viewWillAppear: , tabBar 5 UITabBarButton
* : [ ] UITabBarButton
*/
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
/**** ****/
[self.tabBar addSubview:self.publishButton];
}
#pragma mark -
/** */
- (UIButton *)publishButton
{
if (!_publishButton) {
_publishButton = [UIButton buttonWithType:UIButtonTypeCustom];
_publishButton.backgroundColor = XMGRandomColor;
[_publishButton setImage:[UIImage imageNamed:@"tabBar_publish_icon"] forState:UIControlStateNormal];
[_publishButton setImage:[UIImage imageNamed:@"tabBar_publish_click_icon"] forState:UIControlStateHighlighted];
_publishButton.frame = CGRectMake(0, 0, self.tabBar.frame.size.width / 5, self.tabBar.frame.size.height);
_publishButton.center = CGPointMake(self.tabBar.frame.size.width * 0.5, self.tabBar.frame.size.height * 0.5);
[_publishButton addTarget:self action:@selector(publishClick) forControlEvents:UIControlEventTouchUpInside];
}
return _publishButton;
}
#pragma mark -
/**
*
*/
- (void)publishClick
{
XMGLogFunc
XMGTestViewController *test = [[XMGTestViewController alloc] init];
[self presentViewController:test animated:YES completion:nil];
}
@end
2カスタムTabBarTabBarをカスタマイズして、TabBarの各サブコントロールの属性と配置を完全に私たちのニーズに合わせて配置してもいいです。
@interface XMGTabBarController ()
@end
@implementation XMGTabBarController
#pragma mark -
- (void)viewDidLoad {
[super viewDidLoad];
/**** UITabBarItem ****/
//
/**** ****/
[self setupOneChildViewController:[[UITableViewController alloc] init] title:@" " image:@"tabBar_essence_icon" selectedImage:@"tabBar_essence_click_icon"];
[self setupOneChildViewController:[[UITableViewController alloc] init] title:@" " image:@"tabBar_new_icon" selectedImage:@"tabBar_new_click_icon"];
[self setupOneChildViewController:[[UIViewController alloc] init] title:@" " image:@"tabBar_friendTrends_icon" selectedImage:@"tabBar_friendTrends_click_icon"];
[self setupOneChildViewController:[[UITableViewController alloc] init] title:@" " image:@"tabBar_me_icon" selectedImage:@"tabBar_me_click_icon"];
/**** TabBar ****/
[self setValue:[[XMGTabBar alloc] init] forKeyPath:@"tabBar"];
}
@end
下のコードはTabBarをカスタマイズしました。mファイルの主な内容は主に書き直します。 layoutSubview この方法では、4つのボタンのサイズとレイアウトを調整し、真ん中に「リリース」ボタンを追加します。同じように、いくつかの注意点があります。【投稿】ボタンの初期化は上記と同じです。単例モードで初期化するべきです。具体的には展開しません。書き換える layoutSubview メソッドの場合は、先に親のタイプを呼び出すべきです。 [super layout Subview; ,このように、まずTabBarItemをレイアウトし、その後、このレイアウトに基づいてレイアウト調整を行うことができる。親の配置方法を呼び出した文は後ろに置いてはいけません。この方法はTabBarItemをレイアウトする以外にも多くの他の構成があります。通過する self.subview 現在のサブコントロールを取得するには、まず印刷して現在のサブコントロールの種類と数を知ることができます。その後、適切なフィルタリングを行います。私たちは基本的にここでKVCの方法を使って、現在のTabBarを変更します。 [self setValue:[[XMGTbar alloc]init]forKeyPath:@「tabBar」 ,属性とメンバー変数の取得方法については、runtime属性とメンバー変数を取得します。を参照してください。
#import "XMGTabBar.h"
@interface XMGTabBar()
/** */
@property (nonatomic, weak) UIButton *publishButton;
@end
@implementation XMGTabBar
#pragma mark -
/** */
- (UIButton *)publishButton
{
if (!_publishButton) {
UIButton *publishButton = [UIButton buttonWithType:UIButtonTypeCustom];
publishButton.backgroundColor = XMGRandomColor;
[publishButton setImage:[UIImage imageNamed:@"tabBar_publish_icon"] forState:UIControlStateNormal];
[publishButton setImage:[UIImage imageNamed:@"tabBar_publish_click_icon"] forState:UIControlStateHighlighted];
[publishButton addTarget:self action:@selector(publishClick) forControlEvents:UIControlEventTouchUpInside];
[self addSubview:publishButton];
_publishButton = publishButton;
}
return _publishButton;
}
#pragma mark -
/**
*
*/
- (void)layoutSubviews
{
[super layoutSubviews];
/**** UITabBarButton frame ****/
//
CGFloat buttonW = self.frame.size.width / 5;
CGFloat buttonH = self.frame.size.height;
CGFloat buttonY = 0;
//
int buttonIndex = 0;
for (UIView *subview in self.subviews) {
// UITabBarButton
// if (![@"UITabBarButton" isEqualToString:NSStringFromClass(subview.class)]) continue;
if (subview.class != NSClassFromString(@"UITabBarButton")) continue;
// frame
CGFloat buttonX = buttonIndex * buttonW;
if (buttonIndex >= 2) { // 2 UITabBarButton
buttonX += buttonW;
}
subview.frame = CGRectMake(buttonX, buttonY, buttonW, buttonH);
//
buttonIndex++;
}
/**** frame ****/
self.publishButton.frame = CGRectMake(0, 0, buttonW, buttonH);
self.publishButton.center = CGPointMake(self.frame.size.width * 0.5, self.frame.size.height * 0.5);
}
#pragma mark -
- (void)publishClick
{
XMGLogFunc
}
@end
現在1に記載されているTabBarロードTabBarItemを検証するためには view DidLoad その後、私達はTabBarをカスタマイズする時にブレークポイント調整を行います。 view DidLoad方法は、カスタムTabBarを実行します。 layoutSubview 方法。3赤点ヒントを追加します
今、多くのアプリのTabBarItemは新しいニュースがある時、右上に赤いヒントがあります。ある時は具体的な数の注意があります。私達がよく使うQQ、微信、微博、頭条などのような機能があります。このヒントはiOSの中の学名はbadgeといいます。iOSのTabBarItemにはこの属性とコントロールが備わっています。自分のニーズに合わせて設定できます。下図はiOS 11のプロファイルです。ヒントの数、色をカスタマイズできます。ヒントの文字の属性は異なる状態で設定できます。
iOS 10の前ではbadgeの提示色は設定できないと言われていますが、必要ならばカスタムTabBarItemを行って、カスタマイズしたbadgeを設定するしかないです。本文はこの点について詳しく説明しません。必要な仲間がいれば、自分で助けを求めてください。