【问题标题】:UIMoreListController edit modalViewController toolbar (or navigation bar) color changeUIMoreListController 编辑modalViewController 工具栏(或导航栏)颜色变化
【发布时间】:2011-12-01 16:28:37
【问题描述】:
这是我的问题。
我有一个使用 UITabBar 的应用程序,并且在某些视图上使用了一些 NavigationControllers,并且这些条都是黑色不透明的。由于我有超过 6 个选项卡,它会打开 UIMoreListController,到目前为止一切顺利,我可以在那里更改导航栏的颜色。
我的问题是当用户单击编辑按钮来组织 moreListController 上的工具栏时。标题栏(我不知道它是工具栏还是导航栏)是蓝色的。我想将其更改为黑色不透明。有谁知道怎么做??
最好的祝福!
马塞洛·马森。
【问题讨论】:
标签:
iphone
objective-c
ios
【解决方案1】:
我在之前的项目中通过实现UITabBarControllerDelegate 协议,特别是这个方法来做到这一点(但是,我必须强调该应用程序从未发布过):
- (void)tabBarController:(UITabBarController *)tabBarController willBeginCustomizingViewControllers:(NSArray *)viewControllers
{
UIView *editView = [[[self.tabBarController view] subviews] objectAtIndex:1];
UINavigationBar *modalNavBar = [[editView subviews] objectAtIndex:0];
[modalNavBar setBarStyle:UIBarStyleBlack];
}
当然,这很容易被破坏,因为我假设这些索引处的子视图数组中的项目是我期望的。
如果您要尝试这种方法,我会谨慎行事,并在继续之前尽可能多地进行检查,例如在访问某些索引之前检查数组的边界 - 检查这些索引处的对象是否响应您将要发送给它们的方法,等等。
再说一次,我不认为我可以为运输应用推荐这种方法,但我不知道在 iOS 5 之前使用它的 UI 自定义 API 有任何其他方法可以做到这一点。
【解决方案2】:
第一个答案很完美,但我想要一些检查......
这样,可能发生的最糟糕的事情(除了苹果不批准该应用程序)是该栏不会改变颜色。
感谢 Jasarien 的指导!
- (void)tabBarController:(UITabBarController *)tabBarController willBeginCustomizingViewControllers:(NSArray *)viewControllers
{
//Prepara a variavel que vai armazenar a view;
UIView* edtView=nil;
for (int i=0; i<[[[self.tabBarController view] subviews]count]; i++) {
//checa se a subview é da classe esperada...
if ([NSStringFromClass( [[[[self.tabBarController view] subviews] objectAtIndex:i]class]) isEqualToString:@"UITabBarCustomizeView"])
{
//Beleza... quebra o laço...
NSLog(@"Achei!! sou eu do Indice %d",i);
edtView=[[[self.tabBarController view] subviews] objectAtIndex:i];
break;
}
}
//Se nao achar a variavel, sabe-se lá deus por que, sai do método.
if (edtView==nil) {
return;
}
//Pega a NavigationBar
UINavigationBar *modalNavBar = nil;
for (int i=0; i<[[edtView subviews]count]; i++) {
//checa se a subview é da classe esperada...
if ([[[edtView subviews]objectAtIndex:i]isKindOfClass:[UINavigationBar class]])
{
//Beleza... quebra o laço...
NSLog(@"Achei!! sou eu do Indice %d",i);
modalNavBar=[[edtView subviews]objectAtIndex:i];
break;
}
}
//checa se a navBar existe
if (modalNavBar==nil) {
return;
}
//muda a cor da navBar!!!
[modalNavBar setBarStyle:UIBarStyleBlack];
}
【解决方案3】:
有一种更简单的方法可以更改所有导航栏样式,而不是单独更改每个样式或为标签栏或其他任何内容设置委托:
[[UINavigationBar appearance] setBarStyle:UIBarStyleBlack];
只需在您的一个初始视图中设置此代码即可。这样,您的更多导航控制器和配置导航控制器(在更多导航控制器中单击“编辑”后出现)获得不同的样式。像这样,您可以将其颜色更改为不同的颜色或更改背景图像。
希望这会有所帮助。