在iOS7 出来混之前,我们的项目里 NavigationBar 很多地方用到个性化的button, 经常会用以下的代码生成一个NavigationBar 中的按钮。
UIButton *button = [UIButton alloc] initWithFrame:...];
[button setImage: ... forState: ...];
UIBarButtonItem *barButton = [[UIBarButtonItem alloc] initWithCustomView: button];
使用以上的代码,你可以给这个barButton 加任何的图片,在iOS6/5 中运行没有任何问题,但在iOS 7中,这个barButton 会往里靠拢大概 10 个points.
以下代码解决了左边的button 移位问题,大家可以依葫芦画瓢,把右边的方法加上。
#import <UIKit/UIKit.h>
@interface UINavigationItem (Spacing)
@end
-------
#import "UINavigationItem+Spacing.h"
#import <objc/runtime.h>
#import <objc/message.h>
@implementation UINavigationItem (Spacing)
// load 在初始化类时调用,每个类都有一个load 方法,
// 类的初始化先于对象
+(void)load
{
//以下方法告诉系统用后面的方法替换前面的
method_exchangeImplementations(
class_getInstanceMethod(self, @selector(setLeftBarButtonItem:)),
class_getInstaceMethod(self, @selector(mySetLeftBarButtonItem:)));
}
- (UIBarButtonItem *)spacer
{
UIBarButtonItem *space = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace
target:nil action:nil];
space.width = -10.0f;
return space ;
}
-(void)mySetLeftBarButtonItem:(UIBarButtonItem*)barButton
{
NSArray* barButtons = nil;
barButtons = [NSArray arrayWithObjects: [self spacer], barButton,nil ];
[self setLeftBarButtonItems: barButtons];
}
@end
原文地址: http://weibo.com/p/1001603699748199641394
另外,在github上也看到一个解决方案(与上面的方案没有本质区别):https://github.com/lemonlabs/UINavigationItem-iOS7Spacing