どうも僕です。
ニュースアプリ的なタブ作りたいですよね。
作りたいですよね?
ということで非常にシンプルではありますが作ってみました。
参考にして頂けたら幸いです。
そーすはこちら
githubにて、ちょこんと置いてます。
既に僕自身色々此方のソースを拡張していじっていますが、
一応雛形となるようにシンプルに纏めてみました。
署名が入っていますが転用は全然構わないのでお好きにどうぞ。
ReadMe的な。
githubの方に書けよ!
という突っ込みは既に閉店ガラガラ故、此方でお願い致します☆
と言っても語ることも特に多くはありません。
このプログラムは
tabVIew・・・タブの見た目部分
TabViewController・・・タブを量産して表示。タップ時の挙動や色の変化部分。
この2つで出来ています。
ソースが汚くて読めない!という点以外特記事項は無いのですが
初心者向けと言うことでTabViewControllerの方を少し解説しますね!
viewDidLoadの記述部分
NSArray *tabList = @[@"1", @"2", @"3", @"4", @"5",
@"6", @"7", @"8", @"9", @"10"];
for (int i = 1; i <= _tabCount; i++) {
UIButton *tab = [[tabVIew alloc]initWithFrame:CGRectMake(_screenW/4 * (i-1), 0, _screenW/4, _screenH/9) :i :tabList[i-1]];
tab.tag = i;
[tab addTarget:self action:@selector(touch:) forControlEvents:UIControlEventTouchUpInside];
[_tabScrollView addSubview:tab];
if (i == 1) {//最初のタブをクリック済みにする。
[self touch:tab];
_nowSelected = 1;
}
}
このソースを見ていて詰まる部分があるとすれば、間違いなくfor文の中です。
此方はtabViewに記述されているタブのレイアウトを利用して、タブのインスタンスを大量生産していますね。
しかし、そのままだとそれぞれのインスタンスを区別する方法がなくなってしまいます。
なので
tab.tag = i;
としています。
changeSelectColorの色変化部分
それぞれタブはタップされるとtouchメソッドが動きます。
引数にbuttonがありますが、先ほどtagで登録したものが
button.tagで取得することが出来ます。
これでそれぞれどのタブがタップされたか区別できますね!
//タップされたタブの色を変化させる。
- (void)changeSelectColor:(UIButton*)button{
UIView *underBar = [self.view viewWithTag:(UNDER_BAR_TAG)];
button.backgroundColor = [self getTabColor:(int)button.tag];
underBar.backgroundColor = [self getTabColor:(int)button.tag];
UILabel *tabName;
tabName = (UILabel*)[button viewWithTag:(LABEL_TAG + button.tag)];
tabName.textColor = [UIColor whiteColor];
}
この部分のソースや他の部分でもところどころ出てくる
viewWithTag
これ。こいつを利用することで、tagを識別してviewを選択することが出来ます!
便利ですね。
tagさん便利!でも。。。
初心者あるあるというか、まぁ僕が嵌った点がいくつかありまして
0は使えない。
ユニークな数字じゃないと駄目。
0は使えないんです。使うと取得できないどころか、変にselfが入ってしまうみたいで挙動がおかしなことになります!
また、当たり前ですけど、数字が被ると正しく取得できません!
この2つは使う上で注意です。
拡張するなら?
タブが乗ってるViewはおそらく閉じることがないので
シングルトンにしてしまうと良いかもしれませんね。
そしたら例えば、下部に表示するViewをスワイプした時に
隣のタブをタップするメッセージを投げれば...
以上です
objective-cはなかなか面倒くさいですね\(^o^)/
というのもTitaniumでJS使ってたからなんですけど...
ですが、いろいろな機能実装が割りとスムーズにできて楽しいです。
Titaniumは敷居が低くて良いのですが、現状だとなかなか高い汎用性があるとはいえません。
やはりクオリティ高いものを作ろうと思うと現状はネイティブが良いですね。