這幾天加班加點的把公司的app都完成了ios11和iphoneX的適配风宁,總算是松了一口氣造虏,在這里做一個小記錄
1.Xcode9下相冊等訪問權(quán)限問題
新的xcode9替換了相冊的權(quán)限key,由原來的 NSPhotoLibraryUsageDescription替換成了NSPhotoLibraryAddUsageDescription葵蒂,在用xcode9打包的時候不提換會導(dǎo)致crash
2.導(dǎo)航欄TitileView的寬度設(shè)置
導(dǎo)航欄在iOS10之前都是默認(rèn)的64p什黑,但是盅粪,到了iOS11就不單單是64p了,可以看一下系統(tǒng)的信息App巧勤,在iOS11添加了大標(biāo)題嵌灰,而且iOS11之前導(dǎo)航欄的title是添加在UINavigationItemView上面,而navigationBarButton則直接添加在navigationBar上面颅悉;如果設(shè)置了titleView沽瞭,則titleView也是直接添加在navigationBar上面
在iOS11之后,蘋果添加了新的類來管理剩瓶,navigationBar會添加在_UIButtonBarStackView上面驹溃,而_UIButtonBarStackView則添加在_UINavigationBarContentView上面;如果沒有給titleView賦值延曙,則titleView會直接添加在_UINavigationBarContentView上面豌鹤,如果賦值給了titleView,則會新生成_UITAMICAdaptorView枝缔,把titleView添加在這個類上面布疙,這個類會添加在_UINavigationBarContentView上面,所以之前的titleView的約束全部要重新寫一個ios11的約束愿卸,至于自帶的naviSearch和largeTitle因為時間有限沒有去研究過灵临,反正暫時還用不到
3.Safe Area
這個是最讓我頭疼的地方,因為iphoneX的緣故趴荸,底部的一片區(qū)域可能要用來做上拉返回Home的操作儒溉,為了防止布局到那里形成了手勢沖突,在ios11里就加上了Safe Area的概念赊舶,這個概念剛開始看文檔沒看懂什么意思睁搭,后來自己試著寫了個demo就理解了
黃色的部分就是蘋果認(rèn)為不會引發(fā)誤操作的區(qū)域赶诊,所以在ios11里布局的layout有了一個新的約束參照就是Safe Area,那我們之前的布局因為會導(dǎo)致"探底"所以要做修改
如果是用xib完成的約束园骆,只要在右邊菜單欄選中Use Safe Area Layout Guides
就會看到xib里有一個Safe Area的約束參照
那么要做的就是把原先的bottom和top約束從相對于superView改成相對于Safe Area就可以了
如果是用的代碼進(jìn)行的約束舔痪,就要改一下約束的寫法,下面是個小例子
private let greenView = UIView()
private func setupView() {
greenView.translatesAutoresizingMaskIntoConstraints = false
greenView.backgroundColor = .green
view.addSubview(greenView)
let margins = view.layoutMarginsGuide
NSLayoutConstraint.activate([
greenView.leadingAnchor.constraint(equalTo: margins.leadingAnchor),
greenView.bottomAnchor.constraint(equalTo: margins.bottomAnchor)
])
}
上面的代碼是相對于原先的view進(jìn)行約束,效果如下
if #available(iOS 11, *) {
let guide = view.safeAreaLayoutGuide
NSLayoutConstraint.activate([
greenView.leadingAnchor.constraintEqualToSystemSpacingBelow(guide.topAnchor, multiplier: 1.0),
guide.bottomAnchor.constraintEqualToSystemSpacingBelow(greenView.bottomAnchor, multiplier: 1.0)
])
}
上面的代碼則是選擇用safeArea進(jìn)行約束锌唾,效果如下
那如果是像我一樣之前用的masnory的锄码,只要把block里面和top,bottom有關(guān)的刪除掉晌涕,在下面模仿上面的樣式加上相關(guān)約束就可以了
------------------更新----------------------
最新的masnory已可以支持safeArea
4.UITableView
UIScrollView相關(guān)的東西一起記在這里伤疙,都是相同的問題。
首先是automaticallyAdjustsScrollViewInsets這個屬性被廢棄了嵌巷,之前如果設(shè)置automaticallyAdjustsScrollViewInsets=NO鸟雏,就不會偏移64p,在ios11里要用新的屬性來設(shè)置
if #available(iOS 11.0, *) {
tableView.contentInsetAdjustmentBehavior = .never
}
然后ios11里默認(rèn)啟用Self-Sizing惧财,tableView不會一次性計算所有的cell的高度了巡扇,只會計算當(dāng)前屏幕能夠顯示的cell個數(shù)再加上幾個,滑動時垮衷,tableView不停地得到新的cell厅翔,更新自己的contenSize,在滑到最后的時候搀突,會得到正確的contenSize刀闷,所有estimated 高度默認(rèn)值從iOS11之前的 0 改變?yōu)閁ITableViewAutomaticDimension,如果不想開啟的話可以用下面的方法關(guān)閉
tableView.estimatedRowHeight = 0;
tableView.estimatedSectionHeaderHeight = 0;
tableView.estimatedSectionFooterHeight = 0;
5.iphoneX全屏顯示
這個只要添加一個尺寸為1125?×?2436的啟動圖就可以了仰迁,在Contents.json里加上
{
"extent" : "full-screen",
"idiom" : "iphone",
"subtype" : "2436h",
"filename" : "IOS開機(jī)X.png",
"minimum-system-version" : "11.0",
"orientation" : "portrait",
"scale" : "3x"
}
6.IQKeyBoardManager不顯示Done按鈕的問題
目前這個問題還沒有解決甸昏,看了下作者的github都快幾個月沒更新了,但是有沒有什么更好的解決方案徐许,現(xiàn)在暫時用的替代方案是點擊空白處讓鍵盤消失的方法筒扒,如果有什么更好的解決方案請留言告訴我,多謝
------------------更新----------------------
最新的IQKeyBoardManager已解決這個問題