iOS開發(fā)經(jīng)驗(3)-NavigationBar&TabBar&StatusBar

目錄:
  1. NavigationBar
  2. 由導(dǎo)航欄引起的零點坐標(biāo)問題
  3. TabBar
  4. StatusBar
  5. NSAttributedString
  6. 文本自適應(yīng)
1. NavigationBar
  • 父子關(guān)系:UINavigationController->
    UINavigationbar(設(shè)置tintColor/barTintColor/圖像)
    UINavigationItem(設(shè)置左右按鈕/title/titleview)( 上下平級)
  • translucent 管理半透明效果
    YES為開啟 NO為關(guān)閉 iOS7之后默認(rèn)為YES凭舶。當(dāng)為YES時ViewController上的View的原點坐標(biāo)會以navigationBar以下的坐標(biāo)為原點,就是在view 上創(chuàng)建視圖將不在考慮navigationBar的高度
  • titleTextAttributes 是UINavigationBar的一個屬性簸搞,通過此屬性可以設(shè)置title部分的字體茉贡。有時我們在開發(fā)過程中會遇到當(dāng)我們導(dǎo)航欄的顏色是比較暗的顏色是我們設(shè)置的文字不容易看見塞栅,這個時候我們用titleTextAttributes可以設(shè)置title字體顏色。
    setTitleTextAttributes:@{NSForegroundColorAttributeName:[UIColor whiteColor]}
  • title 和 navigationItem.title 的區(qū)別當(dāng)你的項目中沒有tabBarController時.title和navigationItem.title效果是一樣的當(dāng)你的項目中有設(shè)置 tabBarController 時設(shè)置self.title會顯示在TabBarItem上和navigationBar上腔丧。但如果你只需要TabBarItem上和NavigationBar上顯示的不一樣的話這些都需要單獨設(shè)置放椰。
  • navigationBarHidden,為了app的界面更好看通常我們都會給viewController一個背景圖片,這個時候navigationBar在不是必須要的情況下navigationBar會影響界面的美觀我們通常會將navigationBar隱藏起來再需要的時候?qū)⑵滹@示出來愉粤。
self.navigationController.navigationBarHidden = NO; 
self.navigationController.navigationBar.hidden = NO;
兩種方法不一樣
兩種方法都是可以隱藏導(dǎo)航欄的砾医,隱藏之后依然可以使用push和pop方法。
但是如果用navigationBar.hidden隱藏導(dǎo)航欄科汗,我們可以繼續(xù)使用navigationBarHidden提供的滑動pop效果.
如果用navigationBarHidden藻烤,這個操作將無效;
但前者navigationBar.hidden沒有系統(tǒng)自動的動畫效果。
  • barStyle設(shè)置navigationBar的顏色,系統(tǒng)只支持這兩種格式
self.navigationController.navigationBar.barStyle = UIBarStyleBlack;UIBarStyleDefault = 0,
//白色默認(rèn)UIBarStyleBlack = 1
//黑色
  • barTintColor 背景色; tintColor分別是item的顏色怖亭;titleTextAttributes可以設(shè)置title字體顏色涎显。
self.navigationController.navigationBar.barTintColor = [UIColor redColor];self.navigationController.navigationBar.tintColor = [UIColor whiteColor];
  • UINavigationItem自定義view大小一般為w=h=30;用btn.imageEdgeInsets = UIEdgeInsetsMake(0, -20, 0, 0)指定位置,視圖的x和y無效
    //設(shè)置導(dǎo)航標(biāo)題視圖,就是這一塊可以加載任意一種視圖,視圖上下左右居中顯示在標(biāo)題的位置,視圖的x和y無效
    UIView *textView1=[[UIView alloc]initWithFrame:CGRectMake(10, 10, 50, 30)];
    textView1.backgroundColor=[UIColor whiteColor];
    [self.navigationItem setTitleView:textView1];
  • 導(dǎo)航欄透明
[self.navigationController.navigationBar setBackgroundImage:[UIImage new]
forBarMetrics:UIBarMetricsDefault];
//shadowImage,是導(dǎo)航欄下面的那根細線兴猩,如果不設(shè)置則會看到一根線期吓。
self.navigationController.navigationBar.shadowImage = [UIImage new];
  • 導(dǎo)航欄透明漸變
self.barImageView = self.navigationController.navigationBar.subviews.firstObject;
對self.barImageView.alpha 做出改變
  • [UINavigationBar appearance]類方法
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    [UINavigationBar appearance].tintColor = [UIColor orangeColor];
    [[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"m_nav64"] forBarMetrics:UIBarMetricsDefault];
    return YES;
}
2. 由導(dǎo)航欄引起的零點坐標(biāo)問題

屏幕原點的改變(只要是VC中的控件,都是從設(shè)備左上角的(0,0)開始算的)倾芝。iOS 7之后都是從Statusbar左上角(0讨勤,0)開始布局的,但是有時晨另,我們也會遇到在 NavigationController 中是以(0潭千,64)布局的,此處又是什么情況呢借尿?先來看一下下面三個屬性:

  • edgesForExtendedLayout
    表示視圖是否覆蓋到四周的區(qū)域刨晴,默認(rèn)是UIRectEdgeAll,即上下左右四個方向都會覆蓋路翻,那么為讓頂部不進行延伸到導(dǎo)航欄覆蓋的區(qū)域狈癞,我們可以把頂部區(qū)域延伸去掉。這個屬性是UIExtendedEdge類型茂契,用來制定視圖的哪條邊需要擴展蝶桶。默認(rèn)是UIRectEdgeAll,也就是全屏布局(iOS7中鼓勵這樣掉冶,這樣可以透過半透明的bar看到一些模模糊糊的內(nèi)容)真竖,如果設(shè)置為UIExtendedEdgeNone,view就不會延伸到bar的后面了
  • extendedLayoutIncludesOpaqueBars默認(rèn)值NO厌小,這個屬性指定了當(dāng)Bar使用了不透明圖片時疼邀,視圖是否延伸至Bar所在區(qū)域; 但是Bar的默認(rèn)屬性是透明的召锈。也就是說只有在不透明下才有用;因此获询,如果我們自定義了nav bar背景圖片涨岁,view會從導(dǎo)航欄下面開始布局。
  • automaticallyAdjustsScrollViewInsets默認(rèn)值是YES吉嚣,如果視圖里面存在唯一一個UIScrollView或其子類View,那么它會自動設(shè)置相應(yīng)的內(nèi)邊距(如果有navbar的時候梢薪,這個內(nèi)邊距是64,這樣scrollview可以占滿屏幕尝哆,內(nèi)容在64像素以下秉撇,不會被遮到,滑動scrollview,可以透過半透明效果看到scrollview上面的內(nèi)容)琐馆。設(shè)置改變的是inset规阀,而不是frame。
  • VC中的view默認(rèn)會對UIScrollView做一個適應(yīng)導(dǎo)航欄的處理瘦麸,由此推測谁撼,其實只要是VC中的控件,都是從設(shè)備左上角的(0,0)開始算的滋饲,只是對于UIScrollView厉碟,VC會自動調(diào)整一下內(nèi)容的位置而已。
    在有導(dǎo)航的情況下屠缭,可視范圍的Y坐標(biāo)就是從64開始的箍鼓,除了UIScrollView的控件,定位的時候呵曹,都應(yīng)當(dāng)以(0,64)為原點款咖;而UIScrollView如果是全屏的,那么無所謂逢并,如果不是全屏的之剧,請注意是否需要設(shè)置VC的automaticallyAdjustsScrollViewInsets。
  • 所以說有時砍聊,我們發(fā)現(xiàn)原點位置變化了背稼,就可以看看上述幾個屬性是否有設(shè)置改動的。經(jīng)常我們用到 tableViewcollectionView 的時候就需要設(shè)置 self.automaticallyAdjustsScrollViewInsets = NO, 不讓其自動調(diào)整玻蝌。
  • 這幾個屬性當(dāng)使用的時候互相影響互相有聯(lián)系蟹肘,對原點改變的影響力:navigationBarHidden> edgesForExtendedLayout> translucent> extendedLayoutIncludesOpaqueBars
3. 定制TabBar

*父子關(guān)系:UITabBarController->UITabbar(設(shè)置tintColor/barTintColor/圖像)->UITabBarItem(設(shè)置titile/image/badgeValue ; 每個tabBarItem對應(yīng)一個viewController)

  • 圖片渲染

  • 隱藏tabbar

第一種
vc.hidesBottomBarWhenPushed = YES;
[self.navigationController pushViewController:vc animated:YES];
第二種
//隱藏
self.hidesBottomBarWhenPushed = YES;
//顯示
self.hidesBottomBarWhenPushed = NO;
第三種
//隱藏TabBar
- (void)hideTabBar {
    if (self.tabBarController.tabBar.hidden == YES) {
        return;
    }
    UIView *contentView;
    if ( [[self.tabBarController.view.subviews objectAtIndex:0] isKindOfClass:[UITabBar class]] )
        contentView = [self.tabBarController.view.subviews objectAtIndex:1];
    else
        contentView = [self.tabBarController.view.subviews objectAtIndex:0];
    contentView.frame = CGRectMake(contentView.bounds.origin.x,  contentView.bounds.origin.y,  contentView.bounds.size.width, contentView.bounds.size.height + self.tabBarController.tabBar.frame.size.height);
    self.tabBarController.tabBar.hidden = YES;
}
//顯示TabBar
- (void)showTabBar {
    if (self.tabBarController.tabBar.hidden == NO)
    {
        return;
    }
    UIView *contentView;
    if ([[self.tabBarController.view.subviews objectAtIndex:0] isKindOfClass:[UITabBar class]])
        contentView = [self.tabBarController.view.subviews objectAtIndex:1];
    else
        contentView = [self.tabBarController.view.subviews objectAtIndex:0];
    contentView.frame = CGRectMake(contentView.bounds.origin.x, contentView.bounds.origin.y,  contentView.bounds.size.width, contentView.bounds.size.height - self.tabBarController.tabBar.frame.size.height);
    self.tabBarController.tabBar.hidden = NO;
}
4. StatusBar:系統(tǒng)提供了2種管理狀態(tài)欄的方式
  • 通過UIViewController管理(每一個UIViewController都可以擁有自己不同的狀態(tài)欄),默認(rèn)是交給控制器來管理的.直接重寫這個方法
    在控制器當(dāng)中設(shè)置狀態(tài)欄樣式
-(UIStatusBarStyle)preferredStatusBarStyle{
    return UIStatusBarStyleLightContent;
}
-(BOOL)prefersStatusBarHidden{
    return YES;
}
  • 由程序來管理隱藏及style,通過UIApplication管理(一個應(yīng)用程序的狀態(tài)欄都由它統(tǒng)一管理)
    前提:通常在開發(fā)當(dāng)中都是應(yīng)用程序來管理狀態(tài)欄的.來做統(tǒng)一管理,不然的話, 會有很多個控制器.會非常的麻煩.想要讓應(yīng)用程序管理狀態(tài)欄,要在info.plist當(dāng)中進行配置,
    添加一個key值:是最后一個,View controller-based status bar appearance
    設(shè)置為NO.就是應(yīng)用程序來管理了.
    UIApplication *app = [UIApplication sharedApplication];
 [app setStatusBarHidden:YES withAnimation:UIStatusBarAnimationFade];
    [app setStatusBarStyle:UIStatusBarStyleLightContent animated:YES];
  • 既然兩種都可以對狀態(tài)欄進行管理俯树,那么什么時候該用什么呢帘腹?
    如果狀態(tài)欄的樣式只設(shè)置一次,那就用UIApplication來進行管理许饿;
    如果狀態(tài)欄是否隱藏阳欲,樣式不一樣那就用控制器進行管理。
    UIApplication來進行管理有額外的好處陋率,可以提供動畫效果球化。
5. NSAttributedString-富文本
  • 普通的文本屬性已經(jīng)無法滿足需求,就需要我們學(xué)習(xí)和使用更加靈活的富文本瓦糟⊥灿蓿可實現(xiàn)圖文混排及生成鏈接(在 UILabel 和 UITextField 中是無法使用該屬性的。更準(zhǔn)確點說是在UILabel 和 UITextField 中無法實現(xiàn)點擊鏈接啟動瀏覽器打開一個URL地址菩浙,因為在此過程中用到了一個代理函數(shù)巢掺。只能用在 UITextView 中句伶。)
  • AttributedString可以分為NSAttributedStringNSMutableAttributedString 兩種。在使用中通過將 AttributedString賦值給控件的attributedText屬性來添加文字樣式陆淀。有此屬性的控件有UILabel考余、UITextFieldUITextView.
  • 兩種用法
//初始化NSMutableAttributedString
NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc]init];
//設(shè)置字體格式和大小
NSString *str = @"設(shè)置字體格式和大小";
NSDictionary *dictAttr = @{NSFontAttributeName:[UIFont systemFontOfSize:14]};
NSAttributedString *attr = [[NSAttributedString alloc]initWithString:str attributes:dictAttr];
[attributedString appendAttributedString:attr];
NSString *str = @"人生若只如初見,何事悲風(fēng)秋畫扇倔约。\n等閑變卻故人心秃殉,卻道故人心易變。\n驪山語罷清宵半浸剩,淚雨霖鈴終不怨钾军。\n何如薄幸錦衣郎,比翼連枝當(dāng)日愿绢要。";
// 創(chuàng)建 NSMutableAttributedString
NSMutableAttributedString *attrStr = [[NSMutableAttributedString alloc] initWithString:str];
// 設(shè)置字體和設(shè)置字體的范圍
[attrStr addAttribute:NSFontAttributeName
                value:[UIFont systemFontOfSize:30.0f]
                range:NSMakeRange(0, 3)];
6. 文本自適應(yīng)
  • sizeToFit
當(dāng) 寫上label.numberOfLines = 0吏恭,寬度不變,高度變化
當(dāng) 沒有寫上label.numberOfLines = 0重罪,寬度自適應(yīng)樱哼,高度變化仍是單行
  • boundingRectWithSize:這個方法是 iOS7 以后根據(jù)寬高屬性計算字符串寬度跟高度的一個方式.不同的屬性會計算出不同的值.具體的可以谷歌下NSStringDrawingOptions.
計算高度:給定具體寬度值,高度值為0剿配;
計算寬度:給定具體高度值搅幅,寬度值為0;
    NSDictionary *attributeDic = @{NSFontAttributeName: [UIFont systemFontOfSize:14]};
CGRect rect = [info boundingRectWithSize:CGSizeMake(0, 30) options:
NSStringDrawingUsesLineFragmentOrigin| 
NSStringDrawingUsesFontLeading
 attributes: attributeDic context:nil];
// 參數(shù)1: 自適應(yīng)尺寸,提供一個寬度(高度),去自適應(yīng)高度(寬度)
// 參數(shù)2:自適應(yīng)設(shè)置 (以行為矩形區(qū)域自適應(yīng),以字體字形自適應(yīng))
// 參數(shù)3:文字屬性,通常這里面需要知道是字體大小
// 參數(shù)4:繪制文本上下文,做底層排版時使用,填nil即可
NSStringDrawingTruncatesLastVisibleLine : 如果文本內(nèi)容超出指定的矩形限制呼胚,文本將被截去并在最后一個字符后加上省略號 . 如果三選項沒有選擇, 忽略此選項.
NSStringDrawingUsesLineFragmentOrigin : 整個文本將以每行組成的矩形為單位計算整個文本的尺寸.
NSStringDrawingUsesFontLeading : 以字體間的行距(leading茄唐,行距:從一行文字的底部到另一行文字底部的間距。)來計算高度蝇更。
NSStringDrawingUsesDeviceMetrics : 計算布局時使用圖像符號邊界, 而不是排版的邊界 .

注意:當(dāng)計算NSMutableAttributedString時沪编, 必須設(shè)置富文本的字體樣式(NSMutableParagraphStyle),才可以計算正確

  • sizeWithAttributes:計算寬度
    適用于根據(jù)字體計算出文本單行的長度和高度(寬度和高度)年扩,注意是單行蚁廓,所以你返回的高度是一個定值。
CGSize size = [s.text sizeWithAttributes:@{NSFontAttributeName:[UIFont systemFontOfSize:10]}];
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末厨幻,一起剝皮案震驚了整個濱河市相嵌,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌况脆,老刑警劉巖平绩,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異漠另,居然都是意外死亡,警方通過查閱死者的電腦和手機跃赚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門笆搓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來性湿,“玉大人,你說我怎么就攤上這事满败》羝担” “怎么了?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵算墨,是天一觀的道長宵荒。 經(jīng)常有香客問我,道長净嘀,這世上最難降的妖魔是什么报咳? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮挖藏,結(jié)果婚禮上暑刃,老公的妹妹穿的比我還像新娘。我一直安慰自己膜眠,他們只是感情好岩臣,可當(dāng)我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著宵膨,像睡著了一般架谎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上辟躏,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天谷扣,我揣著相機與錄音,去河邊找鬼鸿脓。 笑死抑钟,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的野哭。 我是一名探鬼主播在塔,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼拨黔!你這毒婦竟也來了蛔溃?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤篱蝇,失蹤者是張志新(化名)和其女友劉穎贺待,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體零截,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡麸塞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了涧衙。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片哪工。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡奥此,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出雁比,到底是詐尸還是另有隱情稚虎,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布偎捎,位于F島的核電站蠢终,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏茴她。R本人自食惡果不足惜寻拂,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望败京。 院中可真熱鬧兜喻,春花似錦、人聲如沸赡麦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽泛粹。三九已至遂铡,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間晶姊,已是汗流浹背扒接。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留们衙,地道東北人钾怔。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像蒙挑,于是被迫代替她去往敵國和親宗侦。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 1.badgeVaule氣泡提示 2.git終端命令方法> pwd查看全部 >cd>ls >之后桌面找到文件夾內(nèi)容...
    i得深刻方得S閱讀 4,631評論 1 9
  • { 11忆蚀、核心動畫 需要簽協(xié)議矾利,但是系統(tǒng)幫簽好 一、CABasicAnimation 1馋袜、創(chuàng)建基礎(chǔ)動畫對象 CAB...
    CYC666閱讀 1,528評論 2 4
  • 前言 最近忙完項目比較閑男旗,想寫一篇博客來分享一些自學(xué)iOS的心得體會,希望對迷茫的你有所幫助欣鳖。博主非科班出身察皇,一些...
    GitHubPorter閱讀 1,416評論 9 5
  • 那次離開廣東之后,我沒有再和超哥聯(lián)系泽台。當(dāng)然超哥也沒有再聯(lián)系我什荣。如果一定說有的話呀忧,唯有一次凌晨,超哥發(fā)來QQ消息:小...
    Xuanlincx閱讀 523評論 0 1
  • 今天把瀟灑姐的《三觀易碎》讀完了溃睹,淋漓暢快。書中提到的很多觀點都有一種相見恨晚的感覺胰坟,雖然網(wǎng)上很多人評價瀟灑姐銅臭...
    怡方閱讀 414評論 0 0