Следуя примеру смека, я создал категорию, но изменил ее, чтобы обеспечить обратную совместимость, а не прямую. Я настраиваю все так, как я хочу, в iOS 7, а затем, если пользователь запускает что-то более низкое, я начинаю возиться с вещами.
@interface UINavigationItem (BarButtonItemSpacingSupport)
- (void)addLeftBarButtonItem:(UIBarButtonItem *)leftBarButtonItem;
- (void)addRightBarButtonItem:(UIBarButtonItem *)rightBarButtonItem;
@end
@implementation UINavigationItem (BarButtonItemSpacingSupport)
- (void)addLeftBarButtonItem:(UIBarButtonItem *)leftBarButtonItem
{
if (SYSTEM_VERSION_LESS_THAN(@"7.0")) {
UIBarButtonItem *negativeSpacer = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace
target:nil action:nil];
negativeSpacer.width = 10;
[self setLeftBarButtonItems:[NSArray arrayWithObjects:negativeSpacer, leftBarButtonItem, nil]];
} else {
[self setLeftBarButtonItem:leftBarButtonItem];
}
}
- (void)addRightBarButtonItem:(UIBarButtonItem *)rightBarButtonItem
{
if (SYSTEM_VERSION_LESS_THAN(@"7.0")) {
UIBarButtonItem *negativeSpacer = [[UIBarButtonItem alloc]
initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace
target:nil action:nil];
negativeSpacer.width = 10;
[self setRightBarButtonItems:[NSArray arrayWithObjects:negativeSpacer, rightBarButtonItem, nil]];
} else {
[self setRightBarButtonItem:rightBarButtonItem];
}
}
@end
А затем, чтобы получить это глобально, у меня есть тонкий UIViewController
подкласс, от которого наследуются все мои контроллеры представления.
@interface INFViewController : UIViewController
@end
@implementation INFViewController
- (void)viewDidLoad {
[super viewDidLoad];
if (SYSTEM_VERSION_LESS_THAN(@"7.0")) {
[self setupNavBarForPreIOS7Support];
}
}
- (void)setupNavBarForPreIOS7Support {
if (self.navigationController) {
UINavigationItem *navigationItem = self.navigationItem;
UIBarButtonItem *leftItem = navigationItem.leftBarButtonItem;
UIBarButtonItem *rightItem = navigationItem.rightBarButtonItem;
if (leftItem) {
[navigationItem addLeftBarButtonItem:leftItem];
}
if (rightItem) {
[navigationItem addRightBarButtonItem:rightItem];
}
}
}
@end
Я понимаю, что дважды проверяю версию ОС (один раз INFViewController
и снова в категории), я оставил ее в категории, если я хочу использовать ее как одноразовую в любом месте проекта.