避免使用适用于iPad的drawRect方法

时间:2012-03-06 03:57:12

标签: iphone ipad uinavigationbar uisplitviewcontroller

目前正在制作一个通用应用程序,我使用drawRect方法在navigationBar for iPhone应用程序上显示图像,但我不想将此方法用于iPad。

我创建了一个用于更改UINavigationBar的类别。我做了以下几点。

    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)   
    { 
        // iPad mode ... dont load anything 
    }
    else 
    {
        // iphone mode .... use an image 
    }

此后它显示一个黑色的空白空间而不是iPad的导航栏。对于iPhone,它工作正常。

我尝试过使用self.navigationController.navigationBar.barStyle = UIBarStyleDefault;在我的Matser&在viewDidLoad中详细显示视图,但仍显示黑色空格。

当设备是iPad时,如何避免使用drawRect方法调用。

由于

2 个答案:

答案 0 :(得分:1)

如果您是UINavigationBar的子类,则应该在每个平台上使用正确的导航栏类。换句话说,界面习语检查应该影响导航栏的创建,而不是它的drawRect:实现。

由于您使用类别来替换drawRect:实现(您不应该这样做),我认为您唯一的选择是动态方法调整。也就是说,您只能在iPhone / iPod Touch上替换drawRect:

考虑将UINavigationBar子类化,因为它更容易,更安全,更清洁。这将有助于避免兼容性问题。

编辑:提供一个示例,假设您的nib文件只包含一个带有自定义UINavigationBar子类的空导航控制器。为此,请在xib编辑器中选择导航栏,然后在检查器中更改其类。

UINavigationController *navigationController = nil;

if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad)
    navigationController = [[UINavigationController alloc] init];
else {
    UINib *nib = [UINib nibWithNibName: @"MyNavigationController" bundle: nil];
    navigationController = [[[nib instantiateWithOwner: nil options: nil] objectAtIndex: 0] retain];
}

在iPhone或iPod Touch上运行时,此代码将从nib文件创建导航控制器。

答案 1 :(得分:0)

如果您在方法开头调用[super drawRect],它将调用默认实现,该实现将正常绘制UINavigationBar

你不应该做自定义子类的原因是UINavigationController直接实例化了它UINavigationBar,你不能告诉它使用你的子类。