需求
項目中需要用到一個只有返回圖片的返回按鈕
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

.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都沒有了,清爽??