今天用了大半天時間給一個小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有個問題,searchBar的placeholder屬性,文字居左,默認是居中的。我的辦法是,非跳轉狀態(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語法,開心(有什么好得瑟的),晚安!