手上的App有一個分享到微信再返回時的閃屏問題,起初看到其它的App也有類似的問題,以為是iOS9的Bug,沒有太在意。今天別人又跟我說起了這個問題,多測試了幾個App,發現都挺正常的,頓時覺得這肯定不是iOS9的Bug了。
閃屏是瞬間的事情,看Console沒有很特別的日志,定位起來一時毫無頭緒,暫時想到的方法是一步一步排除,大概也是最笨的辦法,很耗時間。突然想起來前不久一微信群的群友也問了這個問題,不妨先問問他,說不定先解決了。
翻了幾十頁的聊天記錄,終于找到那個問題,給對方留言。一會兒,就有好消息傳來,他解決了,真是太好了。然而花了兩周時間,這真是個磨人的問題。接著是做夢都不會想到,問題的原因竟是一行代碼導致的,這行代碼的作用是隱藏App返回按鈕的文字。
看看這有問題的代碼:
//將返回按鈕的文字position設置不在屏幕上顯示
[[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(NSIntegerMin, NSIntegerMin)
forBarMetrics:UIBarMetricsDefault];
作用應該是對返回按鈕Title進行無窮大的負偏移,使返回按鈕Title消失在屏幕顯示區域的無窮遠處。
很不湊巧,那位群友也是使用這行代碼。根據我做的筆記,這段代碼應該是來源于這篇文章:自定義iOS7導航欄背景,標題和返回按鈕文字顏色,都是抄過來的肯定沒錯??。
群友給的解決辦法是不用這段代碼,設置返回按鈕Title為透明顏色,很機智有木有?
大概就是這樣:
[[UIBarButtonItem appearance] setTitleTextAttributes:@{NSForegroundColorAttributeName:[UIColor clearColor]}
forState:UIControlStateNormal];
我測試了一下問題就一下子解決了,但是他提醒我原生的UIBarbuttonItem的文字都會變成透明的,我繼續測試還是沒有問題,奇怪。
但是那一行代碼是怎么會導致從其它的App返回時會閃屏呢,不得其解,雖然解決了,給我的感覺就是頭痛醫腳有木有,而且還很管用??。我盯著NSIntegerMin看了一會,突然想會不會是這個值太離譜了?我搜了一下,這個值在64位下的值是-9223372036854775808,非常長的一串數字。實際上最多只需要在一個屏幕之外隱藏應該就夠了不是?
于是,我把上面有問題的代碼換成了下面的:
//將返回按鈕的文字position設置不在屏幕上顯示
[[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(-kScreenWidth, -kScreenHeight)
forBarMetrics:UIBarMetricsDefault];
其中的kScreenWidth和kScreenHeight分別是屏幕寬度與高度。再繼續測試,居然也能解決問題,這狗屎運。。。那么問題是計算量太大還是啥的?不得而知。