使用 UINavigationBar appearance "back" 图标作为自定义按钮?

Use UINavigationBar appearance "back" icon for custom button?

我需要实现自定义导航栏的“<后退”按钮,如推送转场中所示,但在模态上。

我想避免过多的硬编码,发现了 属性 UINavigationBar.appearance().backIndicatorImageUINavigationBar.appearance().backIndicatorTransitionMaskImage

我想用它们将我自己的文本放在它们旁边作为我的按钮,因为使用 .png 看起来不像真实的那样自然。

我试过了,但是这些属性 returns 中的 UIImage 为 nil

func addBackButton() {
    let backButton = UIButton(type: .custom)
    backButton.setImage(UINavigationBar.appearance().backIndicatorImage, for: .normal)
    backButton.imageView?.contentMode = .scaleAspectFit
    backButton.setTitle("Back", for: .normal)
    backButton.setTitleColor(backButton.tintColor, for: .normal)
    
    self.navigationItem.leftBarButtonItem = UIBarButtonItem(customView: backButton)
}

UINavigationBar.appearance().backIndicatorImage 是一个可选值,因此您无法从中获取系统默认 V 形。相反,如果不为空,系统将使用此处提供的图像,否则恢复为系统默认值。

如果定位 iOS 13+,您可以使用 Apple 的 SF Symbols,特别是后退按钮图标被称为 chevron.left。要使用它,请调用 UIImage(systemName: "chevron.left")。对于 iOS 的早期版本,您必须使用图像集资产。您可以使用 if #available(iOS 13.0, *) { ... } else { ... } 定位 iOS 的所有版本,如果在 iOS 13+ 上显示系统图像以改进 UI 外观。

func addBackButton() {
    let backButton = UIButton(type: .custom)
    if #available(iOS 13.0, *) {
        backButton.setImage(UIImage(systemName: "chevron.left"), for: .normal)
    }
    else {
        backButton.setImage(UIImage(named: "backChevon"), for: .normal)
    }
    backButton.imageView?.contentMode = .scaleAspectFit
    backButton.setTitle("Back", for: .normal)
    backButton.setTitleColor(backButton.tintColor, for: .normal)
    
    self.navigationItem.leftBarButtonItem = UIBarButtonItem(customView: backButton)
}