【问题标题】:iOS Different navigation bar color on different pagesiOS 不同页面导航栏颜色不同
【发布时间】:2014-07-07 21:57:35
【问题描述】:

如何根据用户所在的页面更改导航颜色

我想做一些类似于 Vine 应用在探索类别中使用的操作,当用户点击某个类别时,它会以淡入淡出的格式变成按钮的颜色。关于如何做到这一点的任何想法?

【问题讨论】:

标签: ios objective-c colors navigationbar


【解决方案1】:

您可以尝试在 prepareForSegue: 方法中设置导航栏的色调颜色(在您的控制器中使用四个按钮),如下所示

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { if ([segue.identifier isEqualToString:"segueIdentifier here"]) { [self.navigationController.navigationBar setBarTintColor:[UIColor redColor]]; } }

当你回来时不要忘记重置导航栏的色调(在 viewWillAppear 中执行此操作)

或者您可以尝试在方法 viewWillAppear 中的所有控制器中执行此操作:像这样

- (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [self.navigationController.navigationBar setBarTintColor:[UIColor redColor]]; }

【讨论】:

  • prepareForSegue 方法在哪里?另外,我检查了我的 ViewController.m 并没有看到 viewWillAppear 方法,我应该创建一个,如果是的话怎么办?感谢您的帮助。
  • 是的,您应该创建 viewwillappear 方法并在其中调用 [super viewWillAppear:animated]。 prepareForSegue 方法位于 viewController 但如何推送下一个控制器?
  • 我正在使用导航控制器,并且我尝试更改下一页的类文件,并且在单击按钮时会导致它崩溃。对此也有任何想法吗?
  • 你能添加一些代码并解释你在做什么吗?
  • 我的页面嵌入在导航控制器中(在故事板中)。我相信你知道这会在视图上放置一个导航栏。我可以在故事板上的 navigationController 页面上更改颜色和所有内容,但我希望在打开某个页面时更改。我将如何具体做到这一点?
【解决方案2】:

Swift 3.0 解决方案(在 iOS 10 上测试)

嗨!我遇到了同样的问题,最后我找到了很好的解决方案。

viewWillAppear 方法中设置导航栏的颜色在您从父视图推送到子视图时效果很好。导航栏颜色之间的过渡很平滑。

class ChildViewController: UIViewController {

...

override func viewWillAppear(_ animated: Bool) {
       self.navigationController?.navigationBar.barTintColor = UIColor.white
    }

但是,将 ParentViewController 中的条形颜色设置为原始颜色并没有真正起作用。您会注意到颜色的变化,看起来很丑陋且不专业。

要在返回 ParentViewController 时使颜色变化平滑,请在 ChildViewController 的方法 willMove(toParentViewController parent: UIViewController?) 中进行:

class ChildViewController: UIViewController {

...

override func willMove(toParentViewController parent: UIViewController?) {
     self.navigationController?.navigationBar.barTintColor = UIColor.red

借助这种方法,您可以在一个导航控制器中的不同页面上设置不同的导航栏颜色,并在两种方式的视图之间实现平滑的颜色转换 - 进入子视图并返回父视图。

【讨论】:

  • 方法刚刚好,虽然父视图的导航栏仍然与子视图重叠,并且当您滑动子视图后退时导航栏闪烁故障。
【解决方案3】:

这是如何在不同页面上更改导航栏颜色的快速版本。

您可以在要更改导航栏颜色的任何视图控制器的viewDidLoad() 方法中编写这行代码。

self.navigationController!.navigationBar.barTintColor = UIColor.orangeColor()

然后你可以使用 viewWillAppear() 方法,这样当你从另一个不同的控制器返回到同一个视图控制器时,颜色保持不变

viewWillAppear(){
self.navigationController!.navigationBar.barTintColor = UIColor.orangeColor()
}

【讨论】:

    【解决方案4】:

    斯威夫特 4+

    super.viewDidLoad()
    
        let newBackButton = UIBarButtonItem(title: "B",
        style: UIBarButtonItem.Style.plain, target: self, action: "backAction")
            navigationController?.navigationBar.topItem?.backBarButtonItem = newBackButton
        newBackButton.tintColor = .red
        // Do any additional setup after loading the view.
    }
    
    func backAction() -> Void {
        self.navigationController?.popViewController(animated: true)
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多