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

說(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];

后臺(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];

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