Слідом за керівництвом Smek я створив категорію, але змінив її, щоб забезпечити зворотну сумісність, а не вперед. Я налаштовую все так, як мені хочеться в 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
і знову в категорії), я залишив її в категорії, якщо я хочу використовувати це як одноразове в будь-якому місці проекту.