Xcode9 & iOS11 適配

新增的 cmd + 左鍵 彈出菜單個人感覺很多余锋谐,想要改回原來直接跳轉的同學可以在 Preferences - Navigation - Command-click on Code 改成 Jumps to Definition

Xcode9 warning :'xxx' is partial: introduced in iOS 10.0

Xcode9里面OC代碼也支持swift的@available了,不再需要去寫一串[[[UIDevice currentDevice] systemVersion] floatValue]帮掉,在函數(shù)里面可以這么寫

if (@available(iOS 10.0, *)) {
        
}
else {
   
}

然而現(xiàn)在并不能用爹耗,Xcode9打的包不能提交給Apple審核
另外用Xcode9打開原有代碼時千所,下面的代碼提示了'NCWidgetDisplayMode' is partial: introduced in iOS 10.0

- (void)widgetActiveDisplayModeDidChange:(NCWidgetDisplayMode)activeDisplayMode withMaximumSize:(CGSize)maxSize {
    if (activeDisplayMode == NCWidgetDisplayModeCompact) {
        self.preferredContentSize = CGSizeMake([UIScreen mainScreen].bounds.size.width, 110);
    } else {
        self.preferredContentSize = CGSizeMake([UIScreen mainScreen].bounds.size.width, 300);
    }
}

在函數(shù)聲明的時候不能使用@available枷邪,在SO查了一下,最后面加上NS_AVAILABLE_IOS(10_0)就可以消除這個warning

UITableView in iOS11

@property (nonatomic) CGFloat estimatedRowHeight NS_AVAILABLE_IOS(7_0); // default is UITableViewAutomaticDimension, set to 0 to disable
@property (nonatomic) CGFloat estimatedSectionHeaderHeight NS_AVAILABLE_IOS(7_0); // default is UITableViewAutomaticDimension, set to 0 to disable
@property (nonatomic) CGFloat estimatedSectionFooterHeight NS_AVAILABLE_IOS(7_0); // default is UITableViewAutomaticDimension, set to 0 to disable

這三個屬性是iOS7加入的吮播,但是iOS11修改了它們的默認值,全部變成默認開啟的狀態(tài)眼俊。
這個修改產生了下面的問題

  1. UITableViewStyleGrouped樣式的UITableView的sectionHeader和sectionFooter有一個默認的高度意狠,通常不需要顯示header或者footer的時候,會這么寫
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
    return CGFLOAT_MIN;
}

- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
    return CGFLOAT_MIN;
}

但是在iOS11里面你會發(fā)現(xiàn)段頭段尾又回來辣疮胖!改了各種新增的屬性比如safeArea之類的一點用都沒有环戈,最后發(fā)現(xiàn)必須要把estimatedSectionHeaderHeight置0才變回去

  1. safeArea引起的contentInset誤差:一個全屏Frame的scrollView,iOS11會貼心地幫你在頭部添加20px的contentInset澎灸,保證你的內容不覆蓋住狀態(tài)欄院塞。
    但是之前寫的時候想必已經考慮到這20px了,于是你的ScrollView突然多了20px的偏移性昭,影響大小要看具體情況迫悠,當然最好是直接關掉這個特性
_list.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;

iOS 11 下會自動給 frame 觸及到safeArea 的scrollView 添加一個單獨的 safeAreaInsets,inset 上部默認 44px(iPhone X為例)巩梢,有 navigationBar 的情況下是 88px(注:如果設置 navigationBar.hidden = YES,上部會變成 44px),底部則是34 px艺玲,多數(shù)情況下直接把 scrollView 鋪滿屏幕即可括蝠,或者關閉 scrollView 的 contentInsetAdjustmentBehavior,單獨處理饭聚。
但是有時候有需要配合底部工具欄(UIToolBar 會自動適配)忌警,那么需要對不同機型適配 safeArea ,iPhone X (44秒梳, 0法绵, 34, 0)酪碘,其余機型(20朋譬, 0, 0兴垦, 0)徙赢,這個 UIEdgeInset 可以用下面的代碼獲取

//  需要 Xcode 9
- (UIEdgeInsets)safeAreaInset {
    if (@available(iOS 11.0, *)) {
        return [UIApplication sharedApplication].keyWindow.safeAreaInsets;
    }
    else {
        return UIEdgeInsetsZero;
    }
}
  1. 調試發(fā)現(xiàn)tableView在某些情況下會用默認的cell高度(44px)去修正contentInset字柠,例如top + bottom + contentSize計算出來的列表高度小于自己frame的時候。
    修正contentInset也會造成contentOffset的變動狡赐,我的頁面有很多其他的視圖和contentOffset有關窑业,直接導致整個頁面都亂了。
    這里和1相同枕屉,需要設置_list.estimatedRowHeight = 0

綜上常柄,如果沒有用自動計算高度的習慣,推薦直接 hook 掉這三個屬性

@implementation UITableView (DisableEstimateHeight)

+ (void)load
{
    Method newMethod = class_getInstanceMethod([UITableView class], @selector(hook_initWithFrame:style:));
    Method originMethod = class_getInstanceMethod([UITableView class], @selector(initWithFrame:style:));
    
    method_exchangeImplementations(newMethod, originMethod);
}

- (instancetype)hook_initWithFrame:(CGRect)frame style:(UITableViewStyle)style {
    UITableView *tableView = [self hook_initWithFrame:frame style:style];
    
    tableView.estimatedRowHeight = 0;
    tableView.estimatedSectionFooterHeight = 0;
    tableView.estimatedSectionHeaderHeight = 0;
    
    return tableView;
}

@end
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末搀擂,一起剝皮案震驚了整個濱河市西潘,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌哥倔,老刑警劉巖秸架,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異咆蒿,居然都是意外死亡东抹,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進店門沃测,熙熙樓的掌柜王于貴愁眉苦臉地迎上來缭黔,“玉大人,你說我怎么就攤上這事蒂破×蠼鳎” “怎么了?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵附迷,是天一觀的道長惧互。 經常有香客問我,道長喇伯,這世上最難降的妖魔是什么喊儡? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮稻据,結果婚禮上艾猜,老公的妹妹穿的比我還像新娘。我一直安慰自己捻悯,他們只是感情好匆赃,可當我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著今缚,像睡著了一般算柳。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上姓言,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天埠居,我揣著相機與錄音查牌,去河邊找鬼。 笑死滥壕,一個胖子當著我的面吹牛纸颜,可吹牛的內容都是我干的。 我是一名探鬼主播绎橘,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼胁孙,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了称鳞?” 一聲冷哼從身側響起涮较,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎冈止,沒想到半個月后狂票,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡熙暴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年闺属,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片周霉。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡掂器,死狀恐怖,靈堂內的尸體忽然破棺而出俱箱,到底是詐尸還是另有隱情国瓮,我是刑警寧澤,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布狞谱,位于F島的核電站乃摹,受9級特大地震影響,放射性物質發(fā)生泄漏跟衅。R本人自食惡果不足惜峡懈,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望与斤。 院中可真熱鬧,春花似錦荚恶、人聲如沸撩穿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽食寡。三九已至,卻和暖如春廓潜,著一層夾襖步出監(jiān)牢的瞬間抵皱,已是汗流浹背善榛。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留呻畸,地道東北人移盆。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像伤为,于是被迫代替她去往敵國和親咒循。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,779評論 2 354

推薦閱讀更多精彩內容

  • 1绞愚、升級到Xcode9后新建一個工程叙甸,直接報錯,如下圖: 因為在iOS7中引入的Top Layout Guide和...
    lllaa閱讀 208評論 0 0
  • 1.iOS11UIToolBar上添加的按鈕點擊實效 測試總結:iOS11一下按鈕可以正常點擊iOS11以上按鈕點...
    墨狂之逸才閱讀 1,547評論 0 50
  • 簡單寫一些位衩、還在摸索中... 1.升級iOS11后造成的變化 1. 1升級后裆蒸,發(fā)現(xiàn)某個擁有tableView的界面...
    _VisitorsZsl閱讀 7,399評論 15 17
  • 昨天答應兒子今天陪他去新華書店僚祷。 到店里放下東西就帶著兒子去書店了。路也不遠遂赠,很快就到了久妆。 進入書店我和兒子...
    飄雪lovu閱讀 241評論 0 1
  • D小姐再一次打電話來向我抱怨今天的相親對象,這已經至少第5次聽到她的相親故事跷睦,不同的人筷弦,卻有著相同的態(tài)度,相同的結...
    奇小柒閱讀 837評論 0 0