iOS11適配:關(guān)于UITableView的偏移問題記錄

實(shí)驗(yàn)記錄

// AppDelegate
self.window.rootViewController = [[ViewController alloc] init];

// ViewController
UITableView *tv = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain];
tv.delegate = self;
tv.dataSource = self;
[self.view addSubview:tv];
vc.bouns && 無navbar.png

沒有NavBar厢塘,沒有設(shè)置任何東西,最簡單情況侈询。左邊為iOS 8舌涨,右邊為iOS 11。發(fā)現(xiàn)iOS 8沒有向下偏移扔字,iOS 11向下偏移了20像素囊嘉。
在iOS 11中決定tableView的內(nèi)容與邊緣距離的是adjustedContentInset屬性。
在iOS 11中啦租,新增了安全區(qū)域的概念哗伯。由于頂部有狀態(tài)欄,所以系統(tǒng)會自動計算出tv.adjustedContentInset值為{20, 0, 0, 0}篷角。從而使得了tv向下偏移20像素焊刹。

// AppDelegate
self.window.rootViewController = [[UINavigationController alloc] initWithRootViewController:[[ViewController alloc] init]];

// ViewController
UITableView *tv = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain];
tv.delegate = self;
tv.dataSource = self;
[self.view addSubview:tv];

vc.bouns && 有navbar.png

兩者都向下偏移64像素。
在iOS 11以下恳蹲,控制器有automaticallyAdjustsScrollViewInsets屬性虐块,默認(rèn)為YES。

@property(nonatomic,assign) BOOL automaticallyAdjustsScrollViewInsets 
API_DEPRECATED("Use UIScrollView's contentInsetAdjustmentBehavior instead", ios(7.0,11.0),tvos(7.0,11.0)); // Defaults to YES

這個屬性設(shè)置為YES時嘉蕾,系統(tǒng)會自動把tv向下偏移贺奠。
而在iOS 11中,可以看到automaticallyAdjustsScrollViewInsets屬性被廢棄错忱,但是為什么仍然向下偏移了64像素呢儡率。原因和一一致,現(xiàn)在的安全區(qū)域已經(jīng)變成了NavBar以下以清,tv.adjustedContentInset被改為了{64, 0, 0, 0}儿普,因此也向下偏移64。

// AppDelegate
self.window.rootViewController = [[UINavigationController alloc] initWithRootViewController:[[ViewController alloc] init]];

// ViewController
UITableView *tv = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain];
tv.delegate = self; 
tv.dataSource = self;
[self.view addSubview:tv];
self.automaticallyAdjustsScrollViewInsets = NO;

vc.bouns && 有navbar && automaticallyAdjustsScrollViewInsets = NO.png

三是二的反例掷倔。設(shè)置了self.automaticallyAdjustsScrollViewInsets = NO;眉孩,iOS 11以下不偏移了。

// AppDelegate
self.window.rootViewController = [[UINavigationController alloc] initWithRootViewController:[[ViewController alloc] init]];

// ViewController
self.tv = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain];
self.tv.delegate = self;
self.tv.dataSource = self;
[self.view addSubview:self.tv];
        
if (@available(iOS 11.0, *)) {
    self.tv.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
} else {
    self.automaticallyAdjustsScrollViewInsets = NO;
}
vc.bouns && 有navbar && automaticallyAdjustsScrollViewInsets = NO && UIScrollViewContentInsetAdjustmentNever.png

通過設(shè)置tv.contentInsetAdjustmentBehaviorUIScrollViewContentInsetAdjustmentNever,可以不讓系統(tǒng)計算adjustedContentInset值浪汪。從而使得tv不再偏移巴柿。

// AppDelegate
self.window.rootViewController = [[UINavigationController alloc] initWithRootViewController:[[ViewController alloc] init]];

// ViewController
self.navigationController.navigationBar.hidden = YES;

self.view.backgroundColor = [UIColor yellowColor];

self.tv = [[UITableView alloc] initWithFrame:CGRectMake(0, 64, self.view.bounds.size.width, self.view.bounds.size.height - 64) style:UITableViewStylePlain];
self.tv.delegate = self;
self.tv.dataSource = self;
[self.view addSubview:self.tv];

y = 64 && hidden NavBar.png

有時候需要自定義導(dǎo)航控制器,這個時候需要把自帶的NavBar隱藏死遭。發(fā)現(xiàn)在iOS 11以下系統(tǒng)中广恢,tv還是會偏移,并且偏移20像素殃姓。而iOS 11就沒有問題袁波。
解決辦法仍然是設(shè)置automaticallyAdjustsScrollViewInsets 為NO瓦阐。

iOS 11之前的 automaticallyAdjustsScrollViewInsets

我發(fā)現(xiàn)這個屬性很有意思蜗侈。

1 無NavBar

沒有設(shè)置NavigationController的時候,也就是不存在NavBar的時候睡蟋,這個屬性不會起到作用踏幻,tv不會存在偏移問題。

2 有NavBar

2.1 顯示NavBar

當(dāng)設(shè)置了NavigationController的時候戳杀,并不隱藏NavBar该面,會默認(rèn)向下偏移64像素。并且是不管你的NavBar是否遮擋住了tv信卡,都會偏移隔缀。下圖tv.y = 64


tv,y = 64.png

2.2 不顯示NavBar

當(dāng)設(shè)置了NavigationController的時候,并隱藏NavBar傍菇,會默認(rèn)向下偏移20像素猾瘸。并且和2.1一致,無論tv的frame如何丢习,都會偏移牵触。下圖tv.y = 64


tv,y = 64 隱藏NavBar.png

如果你嫌這個屬性麻煩,就設(shè)為NO咐低,然后手動管理tv的frame揽思。

總結(jié)

經(jīng)過上面的實(shí)驗(yàn),個人認(rèn)為见擦,有一個比較好的解決UIScrollView偏移問題的方法钉汗。就是在代碼中加上下面這一段代碼:

if (@available(iOS 11.0, *)) {
    self.tv.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
} else {
    self.automaticallyAdjustsScrollViewInsets = NO;
}

這樣你就可以為所欲為了,科科鲤屡。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末损痰,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子执俩,更是在濱河造成了極大的恐慌徐钠,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件役首,死亡現(xiàn)場離奇詭異尝丐,居然都是意外死亡显拜,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進(jìn)店門爹袁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來远荠,“玉大人,你說我怎么就攤上這事失息∑┐荆” “怎么了?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵盹兢,是天一觀的道長邻梆。 經(jīng)常有香客問我,道長绎秒,這世上最難降的妖魔是什么浦妄? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮见芹,結(jié)果婚禮上剂娄,老公的妹妹穿的比我還像新娘。我一直安慰自己玄呛,他們只是感情好阅懦,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著徘铝,像睡著了一般耳胎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上庭砍,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天场晶,我揣著相機(jī)與錄音,去河邊找鬼怠缸。 笑死诗轻,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的揭北。 我是一名探鬼主播扳炬,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼搔体!你這毒婦竟也來了恨樟?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤疚俱,失蹤者是張志新(化名)和其女友劉穎劝术,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡养晋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年衬吆,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片绳泉。...
    茶點(diǎn)故事閱讀 40,680評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡逊抡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出零酪,到底是詐尸還是另有隱情冒嫡,我是刑警寧澤,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布四苇,位于F島的核電站孝凌,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏蛔琅。R本人自食惡果不足惜胎许,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一峻呛、第九天 我趴在偏房一處隱蔽的房頂上張望罗售。 院中可真熱鬧,春花似錦钩述、人聲如沸寨躁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽职恳。三九已至,卻和暖如春方面,著一層夾襖步出監(jiān)牢的瞬間放钦,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工恭金, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留操禀,地道東北人。 一個月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓横腿,卻偏偏與公主長得像颓屑,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子耿焊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評論 2 361

推薦閱讀更多精彩內(nèi)容