目前正在制作一个通用应用程序,我使用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方法调用。
由于
答案 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
,你不能告诉它使用你的子类。