3

I'm using a UIPageViewController to display few controllers, the first one is UINavigationController, on first sight it looks fine, but when you scroll to next one, the first navigation bar changes the height, and puts title directly under status bar. I've already searched stack overflow but couldn't find any answer to my problem.

Simple demo: https://github.com/augard/PageScrollingBug

Augard
  • 1,299
  • 1
  • 8
  • 10

1 Answers1

0

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.

ivanzoid
  • 5,952
  • 2
  • 34
  • 43