在UINavigationController中调整工具栏的大小

我使用以下命令向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;

或者我必须为UIBarButtonItems指定一个autoresizemask?...

self.backBarButtonItem.autoresizingMask = UIViewAutoresizingFlexibleHeight;

...试图这样做失败


  • 非常好奇,因为当我将代码包含在代码中时,这段代码很好地旋转了工具栏。 旋转工具栏没有问题。

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

  • 你在做任何UIToolbar类别/子类消除其边界? (我只是用空的(void)drawRect:(CGRect)rect子类(void)drawRect:(CGRect)rect去掉边框,但我试了这两个和标准的UIToolbar ,都旋转正常)。无论如何,如果你在做UIToolbar子类/类别,请包含该代码?

  • 此外,你可以选择使用iOS 5的rightBarButtonItems并完全绕过工具栏,例如self.navigationItem.rightBarButtonItems = items; 然后将UIBarButtonItem对象的数组添加到导航栏。

  • 这有点远,但你的视图控制器是如何加载的? 有些人尝试绕过presentViewControllerAnimated和/或pushViewController ,而是简单地创建一个视图控制器,抓住它的视图,将它添加为前一视图控制器视图的子视图。 不幸的是,这最终导致视图控制器层次结构和视图层次结构之间断开连接,并且根据关于视图控制器遏制的WWDC 2011会话102,这可以防止旋转事件被正确传输。 如果这不是您的根视图控制器,请确保使用presentViewControllerAnimatedpushViewController

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

    链接地址: http://www.djcxy.com/p/58379.html

    上一篇: resize toolbar in UINavigationController

    下一篇: Auto resizing UITableView on rotation with flexible width