0

我正在使用以下方法向 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 指定自动调整大小掩码?...

self.backBarButtonItem.autoresizingMask = UIViewAutoresizingFlexibleHeight;

...尝试这样做失败了

4

1 回答 1

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

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

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

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

  5. 这有点远,但是您的视图控制器是如何加载的?有些人尝试绕过presentViewControllerAnimated和/或pushViewController简单地创建一个视图控制器,获取它的视图,将其添加为前一个视图控制器视图的子视图。不幸的是,这最终导致视图控制器层次结构和视图层次结构之间断开连接,并且根据WWDC 2011 会话 102上的视图控制器包含,这可能会阻止正确传输旋转事件。确保您正在使用presentViewControllerAnimated或者pushViewController这不是您的根视图控制器。

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

于 2012-06-27T16:08:09.153 回答