- 主流框架的搭建, 底層UITabBarController晦墙,上層UINavigationController择葡,然后在給其設(shè)置根控制器。當(dāng)然也可以根據(jù)控制器击你,來選擇作為那中導(dǎo)航控制器的根控制器玉组。
- 代碼實現(xiàn)
- (void)setUpOneChildViewController:(UIViewController *)vc image:(UIImage *)image selImage:(UIImage *)selImage title:(NSString *)title
{
// 設(shè)置導(dǎo)航條 (各自控制器,來控制自己導(dǎo)航條的內(nèi)容)
vc.navigationItem.title = title;
...
// 如果想要一個控制器既展示自己的view丁侄,同時想增加一個導(dǎo)航條惯雳,直接包裝成導(dǎo)航控制器
// 包裝成導(dǎo)航控制器
UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:vc];
... // 一般為導(dǎo)航條的設(shè)置內(nèi)容
[self addChildViewController:nav];
}
- 關(guān)于導(dǎo)航條的設(shè)置內(nèi)容不應(yīng)該讓外界知道,應(yīng)該讓其自己進(jìn)行管理 鸿摇,所以需要自定義導(dǎo)航控制器石景。
-
+ load
方法的調(diào)用,當(dāng)程序一啟動的時候就會把這個類加載進(jìn)內(nèi)存 拙吉。(只調(diào)用一次)- 作用:為類分配一個內(nèi)存
-
+ initialize
方法潮孽,當(dāng)前類或者它的子類第一次使用的時候進(jìn)行調(diào)用,如果有多個子類筷黔,也有可能進(jìn)行多次調(diào)用(所以一般會給其內(nèi)部設(shè)置條件執(zhí)行)- 作用:初始化往史,可以在類初始化的時候,給控件設(shè)置一些需要
統(tǒng)一
的設(shè)置必逆。
- 作用:初始化往史,可以在類初始化的時候,給控件設(shè)置一些需要
-
+ (void)initialize
{
// 如果是這個類調(diào)用了方法怠堪,則執(zhí)行以下設(shè)置
if(self == [LXLNavigationController class])
{
// 導(dǎo)航條的設(shè)置
// 設(shè)置導(dǎo)航條的背景揽乱,文字顏色
// 誰用我的導(dǎo)航控制器名眉,只設(shè)置使用自己導(dǎo)航控制器下的導(dǎo)航條
// 獲取整個app里所有導(dǎo)航條外觀的標(biāo)志
// UINavigationBar *bar = [UINavigationBar appearance];
// 獲取當(dāng)前類下的導(dǎo)航條
// self->LXLNavigationController
UINavigationBar *bar = [UINavigationBar appearanceWhenContainedIn:self, nil];
// 設(shè)置導(dǎo)航條背景圖片,必須填UIBarMetricsDefault
// 使用UIBarMetricsDefault凰棉,導(dǎo)航控制器的子控制器view的尺寸不包括導(dǎo)航條部分
[bar setBackgroundImage:[UIImage imageNamed:@"NavBar64"] forBarMetrics:UIBarMetricsDefault];
// 設(shè)置導(dǎo)航條文字顏色
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
// 設(shè)置顏色
dict[NSForegroundColorAttributeName] = [UIColor whiteColor];
dict[NSFontAttributeName] = [UIFont boldSystemFontOfSize:22];
[bar setTitleTextAttributes:dict];
}
}
-
關(guān)于部分功能的實現(xiàn)损拢,比如pop功能的實現(xiàn)(一般都是跳窗,廣告功能撒犀。顯示活動)
- 功能描述福压,點擊
活動按鈕
彈出彈框,并布置蒙版 - 點擊
叉號
按鈕或舞,圖片縮小至活動處消失荆姆,并且,蒙版關(guān)閉 - 代碼實現(xiàn) (盡量模仿蘋果方法去進(jìn)行方法的命名)
- 功能描述福压,點擊
-
自定義蒙版(HUD)UIView 創(chuàng)建接口
+ show
+ hide
模仿系統(tǒng)方法映凳,[類名 show]便可以顯示 [類名 hide]便可以隱藏- 蒙版必須要加載到主窗口上胆筒,這樣才能顯示在最外邊。
+ (void)show
{
LXLCover *cover = [[self alloc] init];
cover.frame = [UIApplication shareApplication].keyWindow.bounds;
cover.backgroundColor = [UIColor blackColor];
cover.alpha = 0.5;
// 獲取主窗口
[[UIApplication shareApplication].keyWindow addSubview:cover];
}
+ (void)hide
{
// 隱藏蒙板
// 遍歷主窗口上的子控件,只要是蒙版類的仆救,就進(jìn)行移除抒和,這樣就把蒙版進(jìn)行移除了
for (UIView *childView in [UIApplication shareApplication].keyWindow.subviews) {
if ([childView isKindOfClass:self]) { // 是蒙板
[childView removeFromSuperview];
}
}
}
- 自定義pop,利用xib彤蔽,因為其尺寸固定摧莽,圖片固定,只是位置需要設(shè)置顿痪,所以直接xib進(jìn)行設(shè)置
- pop顯示在HUD上面镊辕,所以由xib創(chuàng)建,并且直接添加到主窗口上蚁袭。
- 提供接口
+ showInPoint:
丑蛤、~~~+ hideInPoint:
~~~- hideInPoint:
,以為外界要能拿到此pop,才能執(zhí)行點擊縮放的按鈕傳遞的事件(屬于逆?zhèn)魉貉郑枰恚?/li> - 代碼如下
+ (instancetype)showInPoint:(CGPoint)point
{
// xib 中加載pop
LXLPopMenu *menu = [[NSBundle mainBundle] loadNibNamed:@"LXLPopView" owner:nil options:nil][0];
// 從外界的到顯示的中心點
menu.center = point;
// 將其加載到 主窗口上受裹,主要是為了顯示在最外邊
[[UIApplication shareApplication].keyWindow addSubview:menu];
return menu;
}
// 隱藏
- (void)hideInPoint:(CGPoint)point
{
// 執(zhí)行0.5s動畫
[UIView animateWithDuration:.5 animations:^{
// 設(shè)置縮小至的中心點
self.center = point;
// 直接修改父控件的尺寸,是不會影響子控件
// self.bounds = CGRectMake(0, 0, 1, 1);
// 如果設(shè)置0虏束,控件直接縮放為0棉饶,沒有動畫,如果想要動畫镇匀,搞一個最小值
self.transform = CGAffineTransformMakeScale(0.01, 0.01);
} completion:^(BOOL finished) {
// 動畫完成后移除
[self removeFromSuperview];
}];
}
// 點擊關(guān)閉按鈕照藻,調(diào)用
- (IBAction)close:(id)sender {
// 通知代理做事情,告訴代理點擊了關(guān)閉
if ([_delegate respondsToSelector:@selector(popMenuDidClickCloseMenu:)]) {
[_delegate popMenuDidClickCloseMenu:self];
}
}
- 控制器多需完成的事
- 點擊活動彈出pop和HUD
- 點擊
叉號
退出pop和HUD汗侵,不過對去HUD得退出幸缕,需在pop移除以后操作,否則用戶體驗不好(造成蒙版移除了晰韵,但pop 還正在縮蟹⑶恰) - 思考,最能知道什么時候pop移除的就是它自己雪猪,所以如果能將HUD移除的代碼栏尚,能傳給pop,讓pop執(zhí)行是最好了只恨。 這樣就用到了block译仗。(不建議在pop中調(diào)用cover隱藏的方法,那樣就破壞了官觅,這個控件的純潔性纵菌,讓其耦合降低“因為必須有cover的頭文件才行”)下面來具體進(jìn)行介紹:
- 代碼實現(xiàn)
- block定義方法
void (^completion)(參數(shù)) = ^(){};
- 當(dāng)有人調(diào)用block的時候,只需要傳入?yún)?shù)休涤,具體實現(xiàn)由block自己進(jìn)行實現(xiàn)
- block定義 (跟函數(shù)有點相似咱圆,先建立函數(shù),如果使用的時候只需要調(diào)用函數(shù)名加參數(shù)就行了)
Snip20150725_5.png
Snip20150725_6.png
// 點擊活動按鈕的時候調(diào)用
- (void)activity
{
// 彈出蒙板,
// 只要以后想要把一個控件顯示在最外邊闷堡,就添加到窗口隘膘,提供一個show方法
[LXLCover show];
// 彈出pop菜單
LXLPopView *menu = [LXLPopView showInPoint:self.view.center];
menu.delegate = self;
}
// block:作用保存一段代碼
#pragma mark - LXLPopViewDelegate
// 點擊菜單上關(guān)閉按鈕的時候就會調(diào)用
- (void)popMenuDidClickCloseMenu:(LXLPopView *)menu
{
[UIView animateWithDuration:0 animations:nil completion:^(BOOL finished) {
}];
// 定義移動完成的block,保存移動完成的代碼
void (^completion)() = ^{
// 當(dāng)移動完成的時候,把蒙板消失
[LXLCover hide];
};
// block精髓:可以當(dāng)做參數(shù)去用杠览。
// 菜單移動到某個位置弯菊,并且縮放。
[menu hideInPoint:CGPointMake(44, 44) completion:completion];
// [menu hideInPoint:CGPointMake(44, 44) completion:^(){
//
// }];
}
- 所以重寫pop的隱藏方法
- 代碼如下踱阿,傳入 block代碼塊
// 隱藏
- (void)hideInPoint:(CGPoint)point completion:(void (^)())completion
{
/*
void (^completion)() = ^{
// 當(dāng)移動完成的時候管钳,把蒙板消失
[LXLCover hide];
};
*/
[UIView animateWithDuration:.5 animations:^{
self.center = point;
// 直接修改父控件的尺寸,是不會影響子控件
// self.bounds = CGRectMake(0, 0, 1, 1);
// 如果設(shè)置0软舌,控件直接縮放為0才漆,沒有動畫,如果想要動畫佛点,搞一個最小值
self.transform = CGAffineTransformMakeScale(0.01, 0.01);
} completion:^(BOOL finished) {
[self removeFromSuperview];
// [LXLCover hide];
if (completion) {
completion();
}
// 移除蒙板
// [LXLCover hide];
}];
}