swift:在导航栏中设置后退按钮图像

Posted

技术标签:

【中文标题】swift:在导航栏中设置后退按钮图像【英文标题】:swift: setting back button image in nav bar 【发布时间】:2014-07-15 23:24:04 【问题描述】:

我正在尝试在控制器的导航栏中设置后退按钮图像,这是我在 viewDidLoad() 中的代码:

        var backImg: UIImage? = UIImage(named: "back_btn.png")
    println(backImg)
    if var back_img = backImg  
        println("GET IT")
        println(back_img)
        println(UIControlState.Normal)
        println(UIBarMetrics.Default)
    self.navigationController.navigationBar.backItem.backBarButtonItem.setBackButtonBackgroundImage(back_img, forState: UIControlState.Normal, barMetrics: UIBarMetrics.Default)
    

我试图将它们放到 viewWillLoad 中,但得到了同样的错误

带有错误消息的控制台:

<UIImage: 0x7ff37bd85750>
GET IT
<UIImage: 0x7ff37bd85750>
VSC14UIControlState (has 1 child)
(Enum Value)
fatal error: unexpectedly found nil while unwrapping an Optional value

我不知道哪一部分出了问题。似乎 back_img 不是 nil,但我收到错误说它是 nil

谢谢!

【问题讨论】:

【参考方案1】:

Swift 3.0 + 中将下面的代码放入 appdelegate didFinishLaunchingWithOptions 方法中,它将完美运行

let backImage = UIImage(named: "BackNavigation")?.withRenderingMode(.alwaysOriginal)
UINavigationBar.appearance().backIndicatorImage = backImage
UINavigationBar.appearance().backIndicatorTransitionMaskImage = backImage
UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffsetMake(0, -80.0), for: .default)

或者对于 Swift 4.0 +

let backImage = UIImage(named: "back-icon").withRenderingMode(.alwaysOriginal)
UINavigationBar.appearance().backIndicatorImage = backImage
UINavigationBar.appearance().backIndicatorTransitionMaskImage = backImage
UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffset(horizontal: 0, vertical: -80.0), for: .default)

最后一行将删除Navigation Back Button 的标题,如果您不想删除标题,则只需删除最后一行

【讨论】:

你好,我尝试了上面的解决方案,背景图片没有变化。不知道从这里去哪里。 Tristan 请分享您的代码 sn-p 如果无法正常工作,还请尝试确保您在解决方案中添加了“后退图标”图像?【参考方案2】:

如果您想更改每个控制器中的后退按钮,您可以在 didFinishLaunchingWithOptions 中将其添加到应用委托

    let backImg: UIImage = UIImage(named: "back_button")!
    UIBarButtonItem.appearance().setBackButtonBackgroundImage(backImg, forState: .Normal, barMetrics: .Default)

【讨论】:

@CunchalRaj UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffsetMake(0, -60), for: UIBarMetrics.default) 这可以解决问题【参考方案3】:

我通过查看示例代码找到了答案。 1)在情节提要中创建一个条形按钮项。 2) 使用 IBOutlet 将该按钮链接到控制器 3) 给按钮添加图片

 var backImg: UIImage = UIImage(named: "back_btn")
 backBtn.setBackgroundImage(backImg, forState: .Normal, barMetrics: .Default)

PS:图片需要添加到Images.xcassets文件夹中,详见示例代码UICatalog。

【讨论】:

您好,我的图片由于某种原因被拉伸了。你的图片尺寸是多少? 图像被拉伸是因为默认分配给bar item的空间。解决此问题的一种方法是在情节提要中选择导航项并在“后退按钮”文本框中放置一个空格。然后,当您设置图像时,它被限制为剩余空间......另一种方法是将 UIButton 设置为 BarButton 项。 @goggelj,我已经在导航栏中的故事板中设置了一个空格 -> 后退按钮。但图像再次被拉伸。你有什么解决办法吗? @mehul,如果您在导航栏上有一个栏项(内部栏按钮项),请选择它并确保它在“标题”中也有空格 @goggelj,谢谢,但我已经检查并感谢您的解决方案。谢谢。【参考方案4】:
    self.navigationController?.navigationBar.backIndicatorImage = UIImage(named: "back-icon")
    self.navigationController?.navigationBar.backIndicatorTransitionMaskImage = UIImage(named: "back-icon")

【讨论】:

【参考方案5】:

//这是在默认导航栏中设置带有图像和操作的后退按钮的完美解决方案

首先在导航栏中添加 UIBarButton

然后转到故事板中文件检查器中的属性并添加空间以隐藏后退按钮标题文本

在 Ui Bar 按钮图像中设置图像

/写点击动作方法/

要启用滑动弹出(返回上一个控制器),请在 ViewDidLoad 方法中编写两行代码

你会得到完美的后退按钮和滑动到后退动画

//注意:- 要禁用后退按钮上一个视图控制器标题,请在情节提要文件检查器的后退按钮的标题文本中添加一个空格

【讨论】:

请在代码中包含可搜索和可选择的文本,而不是图像。【参考方案6】:

另一种方式: 单击故事板中的导航控制器(不是 UIViewController 本身中的导航控制器)。然后,在 RHS 的属性部分,您将看到背面图像和背面蒙版。设置回图像,你就完成了。

【讨论】:

【参考方案7】:

Swift 4+ 版本

let backImage = UIImage(named: "back-icon").withRenderingMode(.alwaysOriginal)
UINavigationBar.appearance().backIndicatorImage = backImage
UINavigationBar.appearance().backIndicatorTransitionMaskImage = backImage
UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffset(horizontal: 0, vertical: -80.0), for: .default)

【讨论】:

以上是关于swift:在导航栏中设置后退按钮图像的主要内容,如果未能解决你的问题,请参考以下文章

如何在swift 4中的导航栏上添加图像后退按钮

在 Swift 的导航栏中设置图像

如何在导航栏swift ui中设置左右按钮(前导/尾随)?

导航栏中的 Swift 自定义后退按钮

在 Swift iOS 8 中设置透明导航栏和状态栏的图像底图

从 SwiftUI 中的导航栏中删除后退按钮文本