I’m adding a series of buttons to a UINavigationBar using:
NSArray *items;
items = [NSArray arrayWithObjects:
fixedSpace,
refreshStopBarButtonItem,
flexibleSpace,
self.backBarButtonItem,
flexibleSpace,
self.forwardBarButtonItem,
flexibleSpace,
self.actionBarButtonItem,
fixedSpace,
nil];
UIToolbar *toolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0.0f, 0.0f, toolbarWidth, 44.0f)];
toolbar.items = items;
toolbar.tintColor = [[UIColor whiteColor] colorWithAlphaComponent:1.0];
toolbar.autoresizingMask = UIViewAutoresizingFlexibleHeight;
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:toolbar];
All working well.
However when I rotate to landscape mode the toolbar within the uinavigationbar doesn’t rotate.
Adding this code (found on SO) causes the toolbar to resize but not the buttons within it, so they are partially cropped at the bottom and no longer lines up with the toolbar background
- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
CGRect navigationToolbarFrame = self.navigationController.navigationBar.frame;
CGRect customToolbarFrame = CGRectOffset(navigationToolbarFrame, 0.0, navigationToolbarFrame.size.height);
[UIView animateWithDuration:duration animations:^{
//self.toolbar.frame = customToolbarFrame;
// FAILS!!!
//self.navigationItem.rightBarButtonItem.toolbar.frame = customToolbarFrame;
// FAILS!!!
}];
}
What is the correct way to address the toolbar within the uinavigationbar?
Something like…
self.toolbar.frame = customToolbarFrame;
Or do I have to specify a autoresizemask for the UIBarButtonItems?…
self.backBarButtonItem.autoresizingMask = UIViewAutoresizingFlexibleHeight;
… trying to do so like this fails
Very curious because this code rotates toolbar fine when I include it in my code. No problem rotating the toolbar.
I assume your view controller is responding to
shouldAutorotateToInterfaceOrientation? Could you include screen snapshot of what you’re seeing?Are you doing any
UIToolbarcategory/subclass to eliminate its border? (I just subclass with empty(void)drawRect:(CGRect)rectto get rid of border, but I tried both that and the standardUIToolbarand both rotated fine.) Anyway, if you’re doing subclass/category ofUIToolbar, please include that code?Also, you could alternatively just use iOS 5’s
rightBarButtonItemsand bypass the toolbar altogether, e.g.self.navigationItem.rightBarButtonItems = items;will then add the array of UIBarButtonItem objects to the navigation bar.This is a bit of a long shot, but how is your view controller being loaded? Some people try bypassing
presentViewControllerAnimatedand/orpushViewControllerand instead simply create a view controller, grab its view, add it as a subview of the previous view controller’s view. Unfortunately, this ends up with a disconnect between the view controller hierarchy and the view hierarchy, and according to WWDC 2011 session 102 on view controller containment, this can prevent rotation events from being transmitted correctly. Make sure you’re usingpresentViewControllerAnimatedorpushViewControllerif this isn’t your root view controller.I don’t do any of that
willAnimateRotationToInterfaceOrientationor subsequent code, just the simple UIToolbar and it works fine during rotation, so I wonder if the problem rests elsewhere.