Idąc za przykładem Smeka stworzyłem kategorię, ale zmodyfikowałem ją, aby zapewnić kompatybilność wsteczną, a nie do przodu. Skonfigurowałem wszystko, aby działało tak, jak chcę, w iOS 7, a potem, jeśli użytkownik ma coś niższego, zaczynam grzebać w rzeczach.
@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
Aby uzyskać to globalnie, mam cienką UIViewController
podklasę, z której dziedziczą wszystkie moje kontrolery widoku.
@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
Zdaję sobie sprawę, że dwukrotnie sprawdzam wersję systemu operacyjnego (raz INFViewController
i jeszcze raz w kategorii), zostawiłem ją w kategorii na wypadek, gdybyś chciał użyć tego jednorazowo w dowolnym miejscu projektu.