I fixed this in a very hacky way – subclassed UINavigationController
and swizzled its navigationBar
's setCenter:
method (swizzling done with Aspects library):
// In subclassed UINavigationController:
- (void) viewDidLoad
{
[super viewDidLoad];
// This just fixes this bug: http://stackoverflow.com/q/23471624/299063
UINavigationBar *navigationBar = self.navigationBar;
[navigationBar aspect_hookSelector:@selector(setCenter:) withOptions:AspectPositionInstead usingBlock:^(id<AspectInfo> aspectInfo)
{
NSValue *centerValue = aspectInfo.arguments[0];
CGPoint center = [centerValue CGPointValue];
CGPoint fixedCenter = CGPointMake(center.x, 20 + navigationBar.bounds.size.height/2);
[[aspectInfo originalInvocation] setArgument:&fixedCenter atIndex:2];
[[aspectInfo originalInvocation] invoke];
}
error:nil];
}
I also had to set automaticallyAdjustsScrollViewInsets
to NO
in child controller of navigation controller because otherwise navigation bar still would get wrong position at first appear:
// In child controller of UINavigationController.
self.automaticallyAdjustsScrollViewInsets = NO;
Probably there is right way to do it, but I didn't have time.