適配iOS11,原創(chuàng)

今天用了大半天時間給一個小App做iOS11的適配工作,以下是幾個我遇到的問題,覺得值得一說的。

問題一:

當你的列表視圖的style為UITableViewStyleGrouped

self.tabV = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStyleGrouped];

設置組與組之間的間距時,在iOS11系統(tǒng)下,這樣寫

-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{
return 15.0f;
}

是不起作用的。
應該這樣,才有效果。

self.tabV.sectionHeaderHeight = 15.0f;
self.tabV.sectionFooterHeight = 0.0000000001f;

問題二:

這是升級唯一的好消息!以前是否遇到這種問題,使用AVPlayer的視頻播放器,當滑動界面只顯示一半或者在顯示一半繼續(xù)左右滑,然后讓播放器界面重新全部顯示,這時播放器的視頻會卡,但聲音是正常在播放的,現(xiàn)在升級到iOS11時,就沒有這個問題了,蘋果貌似幫你解決了,這個bug我之前一直沒有解決,雖然現(xiàn)在貌似不存在,但看到這里,如果知道的童鞋,請告訴我一聲,一解我心中的困惑。

問題三:

需求是從首頁跳轉進入一個隱藏導航欄的界面,但要顯示返回的箭頭圖標。
iOS11之前,我的解決方案有兩種,一是

[self.navigationController setNavigationBarHidden:YES animated:NO];

二是

_barImageView = self.navigationController.navigationBar.subviews.firstObject;
_barImageView.alpha = 0;

現(xiàn)在用方法一,可以隱藏導航欄,但barButtonItem也會被隱藏,而方法二已經(jīng)無效。打開層級結構圖看(我不記得之前這里的層級結構圖是怎樣的),只有這樣寫才能實現(xiàn)效果,

UIView *backBar = self.navigationController.navigationBar.subviews.firstObject;
//隱藏導航欄
backBar.subviews.lastObject.alpha = 0;
//隱藏導航欄背景的線
backBar.subviews.firstObject.alpha = 0;

但寫完發(fā)現(xiàn)還是有bug,bug就是,隱藏導航欄可以在viewWillAppear里寫,但隱藏導航欄下方的深黑線,必須在viewDidAppear中實現(xiàn),在viewWillAppear實現(xiàn)無效,即蘋果在兩個方法中間又做了一次"恢復"處理(我不知道該怎么形容,底層?不懂)。并且因為是在viewDidAppear中實現(xiàn)的,由有到無的過程是看得見的,影響體驗。

然后發(fā)現(xiàn),按這樣的方式雖然實現(xiàn)了導航欄與黑線的隱藏,但如果你滑動當前這個隱藏了導航欄的控制器的self.view,即當前視圖控制器處于viewWillDisappear的狀態(tài),但沒有真正消失,沒有調(diào)用viewDidDisappear,滑動一兩次后,你停止滑動,讓頁面還是顯示當前的隱藏導航欄的界面時,黑線又出現(xiàn)了,而且無法再將它按剛剛的方式隱藏。因此,這種方法依然不可行(嗯,我說了一堆廢話),最后,發(fā)現(xiàn),在首頁跳轉的代碼處這樣寫,

UIView *backBar = self.navigationController.navigationBar.subviews.firstObject;
backBar.subviews.firstObject.hidden = YES;
backBar.subviews.lastObject.hidden = YES;

在次級界面,即需要隱藏導航欄的界面的viewWillAppear方法里也寫上(為了避免來回滑動導致黑線重新出現(xiàn))

self.navigationController.navigationBar.subviews.firstObject;
backBar.subviews.firstObject.hidden = YES;
backBar.subviews.lastObject.hidden = YES;

即可解決這一系列問題,如果需要優(yōu)化效果,比如還想呈現(xiàn)返回時,只有真正返回到首頁,導航欄才重新顯示,就在首頁的viewDidAppear方法里實現(xiàn)(這三句代碼還是得在首頁有的,因為需要導航欄重新顯示,我只是說在這里實現(xiàn)才有“真正返回,導航欄才顯示”這個效果)。

UIView *backBar = self.navigationController.navigationBar.subviews.firstObject;
backBar.subviews.firstObject.hidden = NO;
backBar.subviews.lastObject.hidden = NO;

問題四:

UISearchController創(chuàng)建的搜索器跳轉控制器(巨坑,超后悔),在iOS11有個問題,searchBarplaceholder屬性,文字居左,默認是居中的。我的辦法是,非跳轉狀態(tài)下,

self.searchC.searchBar.searchTextPositionAdjustment = UIOffsetMake((CGRectGetWidth(self.searchC.searchBar.frame)-6*30)/2, 0);

點擊跳轉時,再讓文字居左。

self.searchC.searchBar.searchTextPositionAdjustment = UIOffsetMake(0, 0);

好奇怪,非跳轉狀態(tài)下要給固定值(6*30)才能讓文字居中并滿足適配(我是試出來的,求大神給我解釋),但這樣寫只是讓文字居中,很遺憾的告訴大家,前面有個討厭的放大鏡圖標懟死在搜索框的左邊,我不知道該怎么把它居中,當然這種情況是出現(xiàn)在iOS11的手機上(測的幾個不同系統(tǒng)的模擬器是如此),所以如果未升級 就OK,依然居中。

問題五:

詭異的線,在蘋果機型是屏幕高度>=637px(即6sp這種機型屏幕,或更大的8p和X等)并且是最新的iOS11系統(tǒng)時,淺灰色的細線會變成深色,而且無論怎么修改都是這個顏色,即使你將顏色賦值為白色都這樣(不懂why?我太菜),但奇怪的是這種情況只發(fā)生初始化后這個線靠近導航欄的情況下,并且不是在tableView的cell中(太難描述這個怪異的bug),如果不滿足剛剛說的條件,就不會出現(xiàn)問題。目前我找不到原因,只摸索出這個規(guī)律,按規(guī)律,用判斷解決了。
以上就是我適配iOS11遇到的一些bug,可以看出來,主要都是UI上的問題。至于適配iPhoneX,暫時沒遇到棘手的問題。描述問題的圖片來不及整理(有時間再補充上),夜深還沒洗澡。第一次寫技術博文,剛學會用一點點Markdown語法,開心(有什么好得瑟的),晚安!

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,347評論 25 708
  • 發(fā)現(xiàn) 關注 消息 iOS 第三方庫、插件、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 15,688評論 4 61
  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標簽默認的外補...
    _Yfling閱讀 14,198評論 1 92
  • 鏈表(list)是Redis中最基本的數(shù)據(jù)結構, 由adlist.h和adlist.c定義事務模塊使用雙端鏈表依序...
    lmem閱讀 581評論 0 0
  • 曉最近一直在啄磨投機與投資的差異,在談了一系列投資的方法論后,開始要談談失敗的例子,總結自己之前投機失敗的例子,現(xiàn)...
    投機曉學閱讀 491評論 1 4

友情鏈接更多精彩內(nèi)容