在UINavigationController中调整工具栏的大小

时间:2012-06-27 15:09:03

标签: iphone objective-c ios uinavigationbar

我正在使用以下方法向UINavigationBar添加一系列按钮:

    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];

一切顺利。

然而,当我旋转到横向模式时,uinavigationbar中的工具栏不会旋转。

添加此代码(在SO上找到)会导致工具栏调整大小但不会调整其中的按钮,因此它们会在底部部分裁剪,不再与工具栏背景对齐

- (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!!!
    }];
}

在uinavigationbar中解决工具栏的正确方法是什么? 有点像...

self.toolbar.frame = customToolbarFrame;

或者我是否必须为UIBarButtonItem指定autoresizemask?...

self.backBarButtonItem.autoresizingMask = UIViewAutoresizingFlexibleHeight;

...尝试这样做会失败

1 个答案:

答案 0 :(得分:0)

  1. 非常好奇,因为当我将它包含在我的代码中时,此代码可以很好地旋转工具栏。旋转工具栏没问题。

  2. 我假设您的视图控制器正在响应shouldAutorotateToInterfaceOrientation?你能否包括你所看到的屏幕快照?

  3. 您是否正在执行任何UIToolbar类别/子类以消除其边界? (我只是用空(void)drawRect:(CGRect)rect子类来摆脱边界,但我尝试了它和标准UIToolbar并且都旋转得很好。)无论如何,如果你正在做{的子类/类别{1}},请包含该代码?

  4. 此外,您也可以使用iOS 5' UIToolbar并完全绕过工具栏,例如然后rightBarButtonItems将UIBarButtonItem对象数组添加到导航栏。

  5. 这是一个很长的镜头,但你的视图控制器是如何加载的?有些人尝试绕过self.navigationItem.rightBarButtonItems = items;和/或presentViewControllerAnimated而只是创建一个视图控制器,抓取其视图,将其添加为前一个视图控制器视图的子视图。不幸的是,这最终导致视图控制器层次结构和视图层次结构之间断开连接,并且根据视图控制器包含上的WWDC 2011 session 102,这可以防止正确传输旋转事件。如果您的根视图控制器不是,请确保您使用pushViewControllerpresentViewControllerAnimated

  6. 我不做任何pushViewController或后续代码,只是简单的UIToolbar,它在旋转期间工作正常,所以我想知道问题是否存在于其他地方。