設置Nav自定義返回按鈕一個有趣的bug

需求

項目中需要用到一個只有返回圖片的返回按鈕

bug演示

錄屏.gif

說明:這個bug其實之前就已經存在了,只是現在得到了領導的重視.各種調試,搞了一上午才找到問題所在.
記錄一下順便提供實現自定義返回按鈕的方法.

1.網上搜羅的一個方法,也是造成這個bug的主要原因:

項目一般會重寫一個繼承UINavigationController的導航控制器 ,然后實現兩個方法:

+ (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;
    
}

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

原因分析:

主要問題在于這個方法:

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

NSIntegerMin 是一個負數,而且數量級很大的一個負數.這個其實是搞的返回按鈕的title的偏移量,NSIntegerMin = LONG_MIN = -9223372036854775808; 當時提供方法的人寫這個值估計是為了保險吧??????????
參數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;//這個我們倒是經常用

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

這個方法到底是怎么給我們搗亂的呢? 我把參數寫小一點的情況:
比如參數都傳-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

后臺列表所顯示的視圖應該不是當前viewController的view直接顯示,而是經過系統內部處理過的(具體怎么處理,技術有限,攤手~),本人試過,偏移量超過-1000 其實就已經會造成gif圖中的bug了,

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

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

連title都沒有了,清爽??

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,287評論 25 708
  • ¥開啟¥ 【iAPP實現進入界面執行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程,因...
    小菜c閱讀 6,523評論 0 17
  • 發現 關注 消息 iOS 第三方庫、插件、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,232評論 4 61
  • 到深夜,心更遠;到無聲,話更響。 總是獨自思著,想不明白就帶到夢里去想。 我以為我想的夠遠了,能想明白, 可我忘了...
    木土有阿杜閱讀 556評論 1 3
  • 一個人靜靜看日出,云清云淡,海浪拍打,有何可悔有何可爭?日出日落,潮起潮落。日復一日,新更替舊。
    Balalaba閱讀 267評論 0 0