升級xCode9 導航欄變化及一些小技巧

導航欄

導航欄高度的變化

iOS11之前導航欄默認高度為64pt(這里高度指statusBar + NavigationBar),iOS11之后如果設置了prefersLargeTitles = YES則為96pt,默認情況下還是64pt,但在iPhoneX上由于劉海的出現statusBar由以前的20pt變成了44pt,所以iPhoneX上高度變為88pt,如果項目里隱藏了導航欄加了自定義按鈕之類的,這里需要注意適配一下。

導航欄圖層及對titleView布局的影響

iOS11之前導航欄的title是添加在UINavigationItemView上面,而navigationBarButton則直接添加在UINavigationBar上面,如果設置了titleView,則titleView也是直接添加在UINavigationBar上面。iOS11之后,大概因為largeTitle的原因,視圖層級發生了變化,如果沒有給titleView賦值,則titleView會直接添加在_UINavigationBarContentView上面,如果賦值了titleView,則會把titleView添加在_UITAMICAdaptorView上,而navigationBarButton被加在了_UIButtonBarStackView上,然后他們都被加在了_UINavigationBarContentView上,如圖:

所以如果你的項目是自定義的navigationBar,那么在iOS11上運行就可能出現布局錯亂的bug,解決辦法是重寫UINavigationBar的layoutSubviews方法,調整布局,上代碼:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17-?(void)layoutSubviews?{

[superlayoutSubviews];

//注意導航欄及狀態欄高度適配

self.frame?=?CGRectMake(0,0,?CGRectGetWidth(self.frame),?naviBarHeight);

for(UIView?*viewinself.subviews)?{

if([NSStringFromClass([viewclass])?containsString:@"Background"])?{

view.frame?=?self.bounds;

}

elseif([NSStringFromClass([viewclass])?containsString:@"ContentView"])?{

CGRect?frame?=?view.frame;

frame.origin.y?=?statusBarHeight;

frame.size.height?=?self.bounds.size.height?-?frame.origin.y;

view.frame?=?frame;

}

}

}

再補充一點,看了簡書App適配iOS11發現titleView支持autolayout,這要求titleView必須是能夠自撐開的或實現了- intrinsicContentSize方法

1

2

3-?(CGSize)intrinsicContentSize?{

returnUILayoutFittingExpandedSize;

}

UIScrollView、UITableView、UICollectionView

大家在iOS11設備上運行出現最多問題應該就是tableview莫名奇妙的偏移20pt或者64pt了。。原因是iOS11棄用了automaticallyAdjustsScrollViewInsets屬性,取而代之的是UIScrollView新增了contentInsetAdjustmentBehavior屬性,這一切的罪魁禍首都是新引入的safeArea,關于safeArea適配這篇文章iOS 11 安全區域適配總結講的很詳細,感興趣的可以看下,我直接貼適配代碼,因為低版本直接用contentInsetAdjustmentBehavior會報警告,所有定義了如下的宏(感謝@炒雞范的指正,之前的宏犯了個低級錯誤...現改為)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16#define??adjustsScrollViewInsets(scrollView)\

do{\

_Pragma("clang?diagnostic?push")\

_Pragma("clang?diagnostic?ignored?\"-Warc-performSelector-leaks\"")\

if([scrollView?respondsToSelector:NSSelectorFromString(@"setContentInsetAdjustmentBehavior:")])?{\

NSMethodSignature?*signature?=?[UIScrollView?instanceMethodSignatureForSelector:@selector(setContentInsetAdjustmentBehavior:)];\

NSInvocation?*invocation?=?[NSInvocation?invocationWithMethodSignature:signature];\

NSInteger?argument?=2;\

invocation.target?=?scrollView;\

invocation.selector?=?@selector(setContentInsetAdjustmentBehavior:);\

[invocation?setArgument:&argument?atIndex:2];\

[invocation?retainArguments];\

[invocation?invoke];\

}\

_Pragma("clang?diagnostic?pop")\

}while(0)

還有的發現某些界面tableView的sectionHeader、sectionFooter高度與設置不符的問題,在iOS11中如果不實現 -tableView: viewForHeaderInSection:和-tableView: viewForFooterInSection: ,則-tableView: heightForHeaderInSection:和- tableView: heightForFooterInSection:不會被調用,導致它們都變成了默認高度,這是因為tableView在iOS11默認使用Self-Sizing,tableView的estimatedRowHeight、estimatedSectionHeaderHeight、 estimatedSectionFooterHeight三個高度估算屬性由默認的0變成了UITableViewAutomaticDimension,解決辦法簡單粗暴,就是實現對應方法或把這三個屬性設為0。

如果你使用了Masonry,那么你需要適配safeArea

1

2

3

4

5if(@available(iOS11.0,?*))?{

make.edges.equalTo()(self.view.safeAreaInsets)

}else{

make.edges.equalTo()(self.view)

}

iPhoneX

LaunchImage

關于iPhoneX(我就不吐槽劉海了...),如果你的APP在iPhoneX上運行發現沒有充滿屏幕,上下有黑色區域,那么你應該也像我一樣LaunchImage沒有用storyboard而是用的Assets,解決辦法如圖,啟動圖的尺寸為1125x2436,or you caniOS開發時如何使用 Launch Screen Storyboard

TabBarController

因為我們的項目用了第三方的TabBarController,在iPhoneX運行,tabBar看起來怪怪的...估計作者要等到猴年馬月才適配iPhoneX,項目又著急上線,就自己修改了第三方,主要是tabBar高度及tabBarItem偏移適配,iPhoneX由于底部安全區的原因UITabBar高度由49pt變成了83pt,可以通過判斷機型來修改相關界面代碼

1

#define?kDevice_Is_iPhoneX?([UIScreen?instancesRespondToSelector:@selector(currentMode)]???CGSizeEqualToSize(CGSizeMake(1125,2436),?[[UIScreen?mainScreen]?currentMode].size)?:?NO)

1.模擬器的變化

相信很多人不太習慣新版模擬器, 那么如何恢復呢, 看下圖:是不是切換很隨意.

2.Jump to Definition 點擊對象跳轉

在XCode9之前,在變量或方法上, 按CMD+單擊, 是直接Jump to Definition,但是現在, 是彈出這個菜單, 對于跳轉到變量的定義,就多了一步了,開始可能會覺得不方便 對于想直接跳轉到變量定義,現在是 control+command+單擊, 也可以:

鼠標用戶: 對準你的對象,Command+鼠標右鍵

觸摸板用戶: 對準你的對象, Command+雙指點擊

如果你有強迫癥, 非要找回之前一模一樣的感覺, 我也可以幫你哦:

是不是很爽啊, 找回初戀的感覺!

3.折疊代碼

Xcode9之前:

局部折疊(折疊一個函數):Command+Option+Left/Right

全局折疊(折疊當前文件下的全部函數): Shift+Command+Option+Left/Right

折疊注釋塊:(/* */之間的文字):Ctrl+Shift+Command+Left/Right

現在:Fold,可以用來折疊方法:

4.代碼編譯器可以放大/縮小自由切換

你還為每周的團隊代碼分享因屏幕小看不清代碼而糾結嗎? 這里就解決了這個問題!

cmd +/- ?可以實現編譯器的放大縮小

5.無線開發真機調試

目前僅支持ios11的真機,使用較簡單,只需在window->Devices and Simulators 下連真機勾選Connect via network, 需要注意的是,必須在一個局域網下:

6.XCode內置的git系統

Source Control的極大增強

支持Github賬戶, XCode -> Preferences -> Accouts 可以登錄你的GitHub賬戶, 登錄后如下:

通過Xcode的菜單 Source Control 最下方的clone, 就可以clone你的github上的工程了,是不是非常方便呢?

7.模擬器可以多開了,并且,模擬器可以登錄

這里不做過多介紹

8.代碼重構

對一個方法或者變量的重命名, 在方法上CMD+單擊, 出現的菜單, 選擇rename 可以看到, 它把重命名會出現的改動,比較直觀哈!

9.Folder和Group的同步問題

在此之前,我們在XCode中,更改Folder的名字,在FInder中工程對應的文件夾的名字并不會同步的改變,這會造成我們重命名文件夾變得非常不方便,最終要先在XCode中移除,然后在Finder中重命名,再添加回Xcode

現在 在Xcode9中重名命Folder,Finder中的也同步的改變了 我們之前建議一個虛擬的group,并不會在對應的文件夾中建立真實的目錄

Xcode9中,默認行為改變了, 變成了會建立對應的真實文件夾, 如果你需要像之前那樣只是建立虛擬的group, 選擇New Group without Folder 即可!

Show in Finder 可以看到,建立了真實的文件夾:

你可能你會擔心, 區分不了這個group到底是虛擬的,還是實際的, 蘋果給出了標識來區分的, 虛擬的左下角有個小的三角形, 如圖:

10.意外警告

如果你收到 This block declaration is not a prototype

Insert ‘void’ 這個警告,如何徹底關閉呢?

Build Settings -> Strict Prototypes 設置為NO即可, 這只是個臨時方案.

11.創建新的顏色 asset catalog

通常我們會 New image ?set, 現在可以 New color set, 然后填充 rgb alpha 值, 具體怎么操作呢?

Assets.xcassets -> + -> New color set-> 填充RGB及alpha

代碼調用方法:

UIColor*customColor;// colorNamed: iOS11才有的, 要做版本判斷.if(@available(iOS11, *)) {// customColor是自定義顏色的文件名字.customColor = [UIColorcolorNamed:@"customColor"];? ? ?}else{ ? ? ? ?customColor = [UIColorcolorWithRed:1green:0.427blue:1.0alpha:1.0]; ? ?}

原文:http://www.cocoachina.com/ios/20170921/20623.html

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,321評論 6 543
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,559評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,442評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,835評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,581評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,922評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,931評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,096評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,639評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,374評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,591評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,104評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,789評論 3 349
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,196評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,524評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,322評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,554評論 2 379

推薦閱讀更多精彩內容