Swift:设置导航栏返回按钮图像

13

我想在我的控制器中设置导航栏返回按钮的图片,以下是我在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。

谢谢!

7个回答

24
Swift 3.0 + 中,将以下代码放置在appdelegatedidFinishLaunchingWithOptions 方法中即可完美运行。
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)

如果您不想删除标题,则可以删除最后一行,否则最后一行将删除导航返回按钮的标题。


嘿,我尝试了上面的解决方案,但背景图片仍然没有改变。不确定接下来该怎么做。 - Tristan Newman
Tristan,请分享你的代码片段,如果不起作用,请确保在你的解决方案中添加了“back-icon”图像。 - Shahid Aslam

17

如果你想在每个控制器更改返回按钮,可以将以下代码添加到app delegate的didFinishLaunchingWithOptions方法中。

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

@ChanchalRaj UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffsetMake(0, -60), for: UIBarMetrics.default) 这样就可以解决问题了。 - Nidhin

13

通过查看示例代码,我已经弄清楚了以下步骤: 1)在故事板中创建一个条形按钮。 2)使用IBOutlet将该按钮链接到控制器。 3)向按钮添加图像。

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

提示:图片应添加到Images.xcassets文件夹中,请参见示例代码UICatalog了解详细信息。


你好,我的图片因某些原因被拉伸了。你的图片尺寸是多少? - Yestay Muratov
图像因默认情况下分配给栏目项的空间而被拉伸。解决此问题的一种方法是在Storyboard中选择导航项并在“返回按钮”文本框中放置一个空格。然后,当您设置图像时,它将被限制在剩余的空间内...另一种选择是将UIButton设置为BarButton项。 - zevij
@goggelj,我已经在故事板中的导航栏->返回按钮中设置了一个空格,但是图像又被拉伸了。你有什么解决办法吗? - Mehul
@mehul,如果您在导航栏上有一个条形项目(位于条形按钮项内),请选中它并确保它的“标题”中也有空格。 - zevij
@goggelj,谢谢你,但我已经检查过了,还是谢谢你的解决方案。谢谢。 - Mehul

12
    self.navigationController?.navigationBar.backIndicatorImage = UIImage(named: "back-icon")
    self.navigationController?.navigationBar.backIndicatorTransitionMaskImage = UIImage(named: "back-icon")

6

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

首先,在导航栏中添加UIBarButton

enter image description here

然后在Storyboard的“文件检查器”属性中添加空格以隐藏返回按钮标题文本

将图片设置为Ui Bar Button Image

enter image description here

/编写单击操作方法/

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

enter image description here

然后,您将获得带有向后滑动动画的完美后退按钮

enter image description here

//注意:要禁用返回按钮的前一个视图控制器标题,请在Storyboard文件检查器中的返回按钮标题文本中添加一个空格


2
请使用可搜索和可选的文本来展示代码,而非图像。 - Peter DeWeese

1

替代方法:在Storyboard中点击导航控制器(而不是UIViewController中的导航控制器)。然后,在右侧的属性部分中,您会看到返回图像和返回遮罩。设置返回图像即可完成。


0

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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接