UIPopoverController框架重叠其contentView的UINavigationBar

时间:2012-08-14 19:50:18

标签: uinavigationbar uisplitviewcontroller uipopovercontroller

知道如何移动导航栏视图以便我有预期的填充吗?看起来弹出框架在导航栏的顶部,左侧和右侧重叠。

这是我在应用程序的根splitViewController派生的弹出控制器中的导航控制器。这是关于<的问题。 iOS 5.1

UIPopoverController's frame covering its content's navigation bar

1 个答案:

答案 0 :(得分:0)

解决方案是在UINavigationBar中删除自定义UIPopoverController样式。我会在准备好后发布实现。

更新

所以这很有趣。 iOS 4.x和iOS 5.0使用真正的真正popover,即浮动popover。自定义导航栏在此弹出框中不起作用(iOS 5.0中的navBar setBackgroundImage和iOS 4.x中的类别drawRect覆盖。)

然而,5.1使用了更多的“slideover”,其中自定义导航栏工作得很好。实际上这是一个更清洁的设计。

无论如何,我的观点是,现在我只需要在纵向和操作系统小于5.1时删除自定义navBar格式。通常,您希望使用respondsToSelector代替手动识别操作系统版本。在这种情况下,这不起作用。

还在开发iOS 4.x修复程序,但这里是iOS 5.0:

在我设置自定义导航栏的appDelete中:

//iOS 5.x:
if ([self.navigationController.navigationBar respondsToSelector:@selector(setBackgroundImage:forBarMetrics:)])
{
    UIImage *image = [UIImage imageNamed:@"header.png"];
    [self.navigationController.navigationBar setBackgroundImage:image forBarMetrics:UIBarMetricsDefault];
}

//iOS 4.x:
@implementation UINavigationBar (CustomBackground)
- (void)drawRect:(CGRect)rect
{   
    UIImage *image = [UIImage imageNamed:@"header.png"];
    [image drawInRect:CGRectMake(0, 0, 320, 44)];
}
@end

我在didFinishLaunching

中设置了一个观察者
//start orientation notifications
[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(didRotate:)
                                             name:@"UIDeviceOrientationDidChangeNotification"
                                           object:nil];
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
- (void) didRotate:(NSNotification *)notification
{
    float version = [[[UIDevice currentDevice] systemVersion] floatValue];

    if (version < 5.1)
    {
        UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation];

        if (UIDeviceOrientationIsPortrait(orientation))
        {
            if ([self.navigationController.navigationBar respondsToSelector:@selector(setBackgroundImage:forBarMetrics:)])
            {
                [self.navigationController.navigationBar setBackgroundImage:nil forBarMetrics:UIBarMetricsDefault];
            }
        }
        else
        {
            if ([self.navigationController.navigationBar respondsToSelector:@selector(setBackgroundImage:forBarMetrics:)])
            {
                UIImage *image = [UIImage imageNamed:@"header.png"];
                [self.navigationController.navigationBar setBackgroundImage:image forBarMetrics:UIBarMetricsDefault];
            }
        }
    }
}