設(shè)置Nav自定義返回按鈕一個(gè)有趣的bug

需求

項(xiàng)目中需要用到一個(gè)只有返回圖片的返回按鈕

bug演示

錄屏.gif

說(shuō)明:這個(gè)bug其實(shí)之前就已經(jīng)存在了,只是現(xiàn)在得到了領(lǐng)導(dǎo)的重視.各種調(diào)試,搞了一上午才找到問(wèn)題所在.
記錄一下順便提供實(shí)現(xiàn)自定義返回按鈕的方法.

1.網(wǎng)上搜羅的一個(gè)方法,也是造成這個(gè)bug的主要原因:

項(xiàng)目一般會(huì)重寫一個(gè)繼承UINavigationController的導(dǎo)航控制器 ,然后實(shí)現(xiàn)兩個(gè)方法:

+ (void)initialize{
    UIImage *backButtonImage = [UIImage imageNamed:@"back_normal"];//返回按鈕的圖片
    
    [[UIBarButtonItem appearance] setBackButtonBackgroundImage:backButtonImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
    
    [[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(NSIntegerMin, NSIntegerMin) forBarMetrics:UIBarMetricsDefault];
}

- (BOOL)navigationBar:(UINavigationBar *)navigationBar shouldPushItem:(UINavigationItem *)item{
    
    UIBarButtonItem *back = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil];
    
    item.backBarButtonItem = back;
    
    return YES;
    
}

使用以上的方法確實(shí)可以實(shí)現(xiàn)我們的需求,但是bug 就是最上面gif圖中的情況.

原因分析:

主要問(wèn)題在于這個(gè)方法:

[[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(NSIntegerMin, NSIntegerMin) forBarMetrics:UIBarMetricsDefault];

NSIntegerMin 是一個(gè)負(fù)數(shù),而且數(shù)量級(jí)很大的一個(gè)負(fù)數(shù).這個(gè)其實(shí)是搞的返回按鈕的title的偏移量,NSIntegerMin = LONG_MIN = -9223372036854775808; 當(dāng)時(shí)提供方法的人寫這個(gè)值估計(jì)是為了保險(xiǎn)吧??????????
參數(shù)UIOffset的定義:

typedef struct UIEdgeInsets {
    CGFloat top, left, bottom, right;  // specify amount to inset (positive) for each of the edges. values can be negative to 'outset'
} UIEdgeInsets;//這個(gè)我們倒是經(jīng)常用

typedef struct UIOffset {
    CGFloat horizontal, vertical; // specify amount to offset a position, positive for right or down, negative for left or up 指定的偏移位置  右下是正數(shù) 左上是負(fù)數(shù).
} UIOffset;

這個(gè)方法到底是怎么給我們搗亂的呢? 我把參數(shù)寫小一點(diǎn)的情況:
比如參數(shù)都傳-100 或者 100:

[[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(100, 100) forBarMetrics:UIBarMetricsDefault];
截圖1 ![截圖2.png](http://upload-images.jianshu.io/upload_images/3284263-917eaf328ec43bc8.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) .png

后臺(tái)列表所顯示的視圖應(yīng)該不是當(dāng)前viewController的view直接顯示,而是經(jīng)過(guò)系統(tǒng)內(nèi)部處理過(guò)的(具體怎么處理,技術(shù)有限,攤手~),本人試過(guò),偏移量超過(guò)-1000 其實(shí)就已經(jīng)會(huì)造成gif圖中的bug了,

為了不出現(xiàn)gif圖中的bug,有兩種解決方式
1.不使用NSIntegerMin那么大數(shù)量級(jí)的負(fù)數(shù) 用 個(gè)-100就行了.
2.不設(shè)置title的偏移量 而是在我們的基類控制器的viewDidLoad中實(shí)現(xiàn)以下方法.

self.navigationItem.backBarButtonItem =  [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil];
截圖3.png

連title都沒(méi)有了,清爽??

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

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,063評(píng)論 25 709
  • ¥開啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個(gè)線程,因...
    小菜c閱讀 7,335評(píng)論 0 17
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,382評(píng)論 4 61
  • 到深夜,心更遠(yuǎn);到無(wú)聲,話更響。 總是獨(dú)自思著,想不明白就帶到夢(mèng)里去想。 我以為我想的夠遠(yuǎn)了,能想明白, 可我忘了...
    木土有阿杜閱讀 592評(píng)論 1 3
  • 一個(gè)人靜靜看日出,云清云淡,海浪拍打,有何可悔有何可爭(zhēng)?日出日落,潮起潮落。日復(fù)一日,新更替舊。
    Balalaba閱讀 292評(píng)論 0 0

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