截屏引起的 WebView 界面頂部被遮擋

最近遇到一個奇怪的問題,在 iPhone 7P 上韭脊,用戶在打開某些活動頁面時童谒,截圖會讓 h5 向上竄,導(dǎo)致頂部被遮擋沪羔。如果是截圖導(dǎo)致的饥伊,后續(xù)滑動 h5 還可以恢復(fù)。如圖

回到頂部和截圖都會引起這個問題

分析

首先 iOS 沒有監(jiān)聽截圖事件蔫饰,不會主動執(zhí)行自己邏輯琅豆; WebView 位置是用約束實現(xiàn)的。頂部約束等于 vc.view 的安全區(qū)頂部對齊篓吁,布局是沒有問題的茫因。
拿到真機(jī)后,查看了 View 視圖發(fā)現(xiàn)是安全區(qū)的 y 坐標(biāo)變化了杖剪。正確的時候是

<UIView: 0x102708ef0; frame = (0 64; 375 812); autoresize = W+H; layer = <CALayer: 0x281087920>>

而截圖后的表現(xiàn)是:

<UIView: 0x104f0c0d0; frame = (0 20; 390 844); autoresize = W+H; layer = <CALayer: 0x281d20b00>>

這是為何冻押?截圖是怎么影響安全區(qū)布局的。一頭霧水盛嘿,然后通過偉大的二分法洛巢,最后確認(rèn)是我們 WebView 頁面里有個自定義導(dǎo)航欄的操作導(dǎo)致的。

        [self.navigationController.navigationBar setBackgroundImage:newImage forBarMetrics:UIBarMetricsDefault];

注釋掉就不會有問題次兆。而且在劉海屏上也沒有問題稿茉,我只能把此問題定義為 iOS 的 bug(iOS 14 也存在的)。

回到頂部

過了幾天有開發(fā)反饋說芥炭,點擊 statusbar (觸發(fā)返回頂部)狈邑,后續(xù)滾動操作都無法恢復(fù)。最后的 bug 表現(xiàn)是一樣的蚤认。但相對于截圖客戶端沒有做任何監(jiān)聽邏輯,scrollToTop 似乎還有些發(fā)掘的空間糕伐。
我大概找了下影響 view 安全邊界的一些 VC 參數(shù)砰琢,edgesForExtendedLayout, extendedLayoutIncludesOpaqueBars,進(jìn)而了解的他們對 self.navigationController.navigationBar.translucent 參數(shù)的影響,其中有一條:

When the navigation bar is translucent, configure the edgesForExtendedLayout and extendedLayoutIncludesOpaqueBarsproperties of your view controller to display your content underneath the navigation bar.
If the navigation bar doesn't have a custom background image, or if any pixel of the background image has an alpha value of less than 1.0, the default value of this property is YES. If the background image is completely opaque, the default value of this property is NO. If you set this property to YES and the custom background image is completely opaque, UIKit applies a system-defined opacity of less than 1.0 to the image. If you set this property to NO and the background image is not opaque, UIKit adds an opaque backdrop.

所以陪汽,是否translucent 會導(dǎo)致導(dǎo)航欄行為變化训唱,進(jìn)而影響安全距離是嗎?我在 setBackgroundImage前后追加了 log:

        NSLog(@"1. translecent = %d", self.navigationController.navigationBar.translucent);
        [self.navigationController.navigationBar setBackgroundImage:newImage forBarMetrics:UIBarMetricsDefault];
       NSLog(@"2. translecent = %d", self.navigationController.navigationBar.translucent);

果然挚冤,執(zhí)行 setBackgroundImage之后况增,translucent 從 1,變?yōu)?0 训挡。也就是說澳骤,初始時 SafeArea 的 y 邊界 = 64 ,當(dāng)設(shè)置了背景后, UIKit 發(fā)現(xiàn)此時不需要額外的 44 高度的導(dǎo)航欄偏差澜薄,translucentChanged=1为肮,并且設(shè)置 SafeArea 的 y 邊界 = 20 但是沒有觸發(fā)渲染,記住這個標(biāo)記位肤京。當(dāng)用戶截圖颊艳、回到頂部時,UIKIt 會更新渲染忘分,所以會導(dǎo)致 bug棋枕。(以上是我對 UIKit 的黑盒運行機(jī)制猜測)

修改方法

在設(shè)置 setBackgroundImage 之前,主動設(shè)置 translucent = 0妒峦,避免觸發(fā)setBackgroundImage 內(nèi)部的檢測是否透明的邏輯重斑。

self.navigationController.navigationBar.translucent = NO;
        [self.navigationController.navigationBar setBackgroundImage:newImage forBarMetrics:UIBarMetricsDefault];

總結(jié)

屬于 iOS 自身對非劉海屏的 bug,現(xiàn)在還存在舟山。[self.navigationController.navigationBar setBackgroundImage:newImage forBarMetrics:UIBarMetricsDefault]; 不一定會導(dǎo)致 translucent = 0,即使你使用了 JPG 或者下面示例中的代碼绸狐。在嚴(yán)選 WebView 有問題,自己全新創(chuàng)建的工程里不會有問題累盗,內(nèi)部機(jī)制待查寒矿。

NSLog(@"1. translecent = %d", self.navigationController.navigationBar.translucent);
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"https://yanxuan.nosdn.127.net/0ae2f591d48e4b29b064fa3f4f71e190.jpg?imageView&thumbnail=750y128&quality=75&axis=5_10"]];
        UIImage *img = [UIImage imageWithData:imageData];
        CGFloat scale = [UIScreen mainScreen].scale;
        UIImage *newImage = [UIImage imageWithData:UIImagePNGRepresentation(img) scale:scale];
        [self.navigationController.navigationBar setBackgroundImage:newImage forBarMetrics:UIBarMetricsDefault];
        NSLog(@"2. translecent = %d", self.navigationController.navigationBar.translucent);
    });
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市若债,隨后出現(xiàn)的幾起案子符相,更是在濱河造成了極大的恐慌,老刑警劉巖蠢琳,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件啊终,死亡現(xiàn)場離奇詭異,居然都是意外死亡傲须,警方通過查閱死者的電腦和手機(jī)蓝牲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來泰讽,“玉大人例衍,你說我怎么就攤上這事昔期。” “怎么了佛玄?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵硼一,是天一觀的道長。 經(jīng)常有香客問我梦抢,道長般贼,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任奥吩,我火速辦了婚禮哼蛆,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘圈驼。我一直安慰自己人芽,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布绩脆。 她就那樣靜靜地躺著萤厅,像睡著了一般。 火紅的嫁衣襯著肌膚如雪靴迫。 梳的紋絲不亂的頭發(fā)上惕味,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天,我揣著相機(jī)與錄音玉锌,去河邊找鬼名挥。 笑死,一個胖子當(dāng)著我的面吹牛主守,可吹牛的內(nèi)容都是我干的禀倔。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼参淫,長吁一口氣:“原來是場噩夢啊……” “哼救湖!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起涎才,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤鞋既,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后耍铜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體邑闺,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年棕兼,在試婚紗的時候發(fā)現(xiàn)自己被綠了陡舅。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡伴挚,死狀恐怖蹭沛,靈堂內(nèi)的尸體忽然破棺而出臂寝,到底是詐尸還是另有隱情,我是刑警寧澤摊灭,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站败徊,受9級特大地震影響帚呼,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜皱蹦,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一煤杀、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧沪哺,春花似錦沈自、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至籍滴,卻和暖如春酪夷,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背孽惰。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工晚岭, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人勋功。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓坦报,卻偏偏與公主長得像,于是被迫代替她去往敵國和親狂鞋。 傳聞我的和親對象是個殘疾皇子片择,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,722評論 2 345