關(guān)于導(dǎo)航欄,先來看一張用storyboard拖出來的item
大家可以看得到.這個(gè)就是我們每天都在用的東西,很熟悉吧? 請(qǐng)用代碼實(shí)現(xiàn)一下吧.
當(dāng)時(shí)心里那個(gè)叫輕視,可是做起來的時(shí)候發(fā)現(xiàn),跟預(yù)期的簡單往往不是那么一回事.
?創(chuàng)建一個(gè)UINavigationBar
UINavigationBar *bar = [[UINavigationBar alloc]initWithFrame:CGRectMake(0, 0, 320, 80)];
[self.view?addSubview:bar];
我們可以設(shè)置導(dǎo)航欄的風(fēng)格屬性,從iOS6之后运沦,UINavigationBar默認(rèn)為半透明的樣式下面就是官方的api?
現(xiàn)在只有兩個(gè)可以用的了.
UIBarStyleDefault? ? ? ? ? = 0,//默認(rèn)
UIBarStyleBlack? ? ? ? ? ? = 1,//黑色默認(rèn)是YES,如果設(shè)置成YES 实檀,放了一副不透明的圖,那么效果是自動(dòng)會(huì)把這個(gè)圖弄成半透明;
如果設(shè)置成NO,放了一副半透明的圖或南,
如果barstyle是UIBarStyleBlack菩暗,效果是半透明的圖自動(dòng)加上黑色背景
如果barstyle是UIBarStyleDefault,效果是半透明的圖自動(dòng)加上白色背景
如果設(shè)置了barTintColor,效果是半透明的圖自動(dòng)加上barTintColor的背景
默認(rèn)是YES授账,如果設(shè)置成YES ,放了一副不透明的圖惨驶,那么效果是自動(dòng)會(huì)把這個(gè)圖弄成半透明;默認(rèn)是YES白热,如果設(shè)置成YES ,放了一副不透明的圖粗卜,那么效果是自動(dòng)會(huì)把這個(gè)圖弄成半透明;
如果設(shè)置成NO,放了一副半透明的圖屋确,
如果barstyle是UIBarStyleBlack,效果是半透明的圖自動(dòng)加上黑色背景
如果barstyle是UIBarStyleDefault续扔,效果是半透明的圖自動(dòng)加上白色背景
如果設(shè)置了barTintColor,效果是半透明的圖自動(dòng)加上barTintColor的背景
如果設(shè)置成NO,放了一副半透明的圖攻臀,
說一下用代碼是怎么加item的吧.
核心代碼?
UIButton *cancel = [UIButton hm_buttonWithTitle:@"左item" fontSize:18 textColor:[UIColor whiteColor]];
[cancel addTarget:self action:@selector(cancelAction:) forControlEvents:UIControlEventTouchUpInside];
UIBarButtonItem *left = [[UIBarButtonItem alloc] initWithCustomView:cancel];
self.navigationItem.leftBarButtonItem = left;
self.title = @"TitleView";
隱藏tabBar
一句代碼隱藏
? ? self.navigationController.toolbarHidden = NO;
在說點(diǎn)有趣的事情
scrollView 的偏移 整體偏移64 相信大家都有遇到過吧? 別告訴我說沒有.
之前,也是一直迷迷糊糊的.直到我在瀏覽博客的時(shí)候,無意中發(fā)現(xiàn)如下,
extendedLayoutIncludesOpaqueBars
automaticallyAdjustsScrollViewInsets
edgesForExtendedLayout
上面這個(gè)三個(gè)屬性是什么鬼? 中間那個(gè)我好像有用到過.那么迷糊就對(duì)了.下面是三個(gè)屬性的解釋
? ? ? ? ? ?首先要提到iOS6和iOS7的差異,在iOS6中纱昧,默認(rèn)布局是忽略了navigationBar以及tabBar所占的位置刨啸,在中間布局;但是iOS7中识脆,默認(rèn)布局是撐滿整個(gè)屏幕的设联,也就是說view的頂部64像素以及底部49像素是分別被navigationBar和TabBar所遮擋的。于是灼捂,蘋果提供了幾個(gè)API供我們使用:
? ? ? ?automaticallyAdjustsScrollViewInsets 默認(rèn)值YES: 從名字上看就非常的直觀仑荐,比如一個(gè)tableView的布局撐滿了整個(gè)屏幕時(shí),這個(gè)屬性會(huì)自動(dòng)設(shè)置contentInset以避免內(nèi)容被遮擋纵东,在一個(gè)有導(dǎo)航欄的view上添加的第一個(gè)scrollView的內(nèi)容會(huì)自動(dòng)向下偏移64個(gè)像素。
? ? ? ? ? ?edgesForExtendedLayout 默認(rèn)值UIRectEdgeAll:默認(rèn)即布局時(shí)撐滿屏幕啥寇,如果設(shè)置為None就與iOS6時(shí)期的布局一樣偎球。
? ? ? extendedLayoutIncludesOpaqueBars 默認(rèn)值NO:產(chǎn)生bug的關(guān)鍵就在于這個(gè)屬性,先看他的意思辑甜,詢問當(dāng)遇到不透明的bar時(shí)是否延伸布局衰絮,默認(rèn)為NO,導(dǎo)航欄設(shè)置了完全不透明的圖片作為背景磷醋,當(dāng)再次返回的時(shí)候猫牡,界面重新布局,導(dǎo)致整體向下偏移64個(gè)像素 邓线。
總結(jié)一下,無非就是ios6 跟iOS7的差異.理解就好,如果不明白回頭再看.
部分內(nèi)容參考自博客 ?點(diǎn)擊瀏覽?
在看一個(gè)效果
因?yàn)檫@個(gè)截屏軟件的愿意不是很溜 :
用一句話來說就是,不用一行代碼 實(shí)現(xiàn)側(cè)滑功能!
很溜是吧?那讓我來講下原理唄?
其實(shí)大家想一想,側(cè)滑很無非就是清掃的時(shí)候,push一個(gè)界面對(duì)不對(duì)?
使用runtime在Load方法里交換蘋果原聲api的
self.navigationController pushViewController:<#(nonnull UIViewController *)#> animated:<#(BOOL)#>
這個(gè)方法 在自己定義一個(gè)委托Delegate,繼承自NSObject元類,遵守UIGestureRecognizerDelegate 協(xié)議,實(shí)現(xiàn)- (BOOL)gestureRecognizerShouldBegin:(UIPanGestureRecognizer *)gestureRecognizer 方法
在使用Method消息轉(zhuǎn)發(fā)機(jī)制 利用runtime截取apiclass_getInstanceMethod 交換兩個(gè)方法的實(shí)現(xiàn).
懵逼不?簡單不?哈哈哈,那么我說人話.
那么如果用自己定義一個(gè)手勢方法跟系統(tǒng)的Push方法進(jìn)行交換,在我用手勢的時(shí)候把系統(tǒng)的push方法給替換掉不就可以?
想實(shí)現(xiàn),其實(shí)寫都不用寫,我已經(jīng)上傳到github 大家直接點(diǎn)start 點(diǎn)贊下載就好?
介紹下自己的小框架吧,里面有各種各樣的語法糖 看到這個(gè)沒有
這里有一個(gè)文本輸入框 ,里面有占位圖片,占位文字.手打很麻煩吧?
看下實(shí)現(xiàn)吧
在給你溜一個(gè).
如果有心人,可以看到,這些都是分類,分類.意味著,你導(dǎo)入Pch文件中,你不需要繼承任何類,沒有一點(diǎn)侵略性.
天色一晚.還有很多很多想和你們分享.如果滿意還請(qǐng)給我點(diǎn)個(gè)贊.支持下~~~指尖猿