保留图标,从“后退”按钮中删除文本
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了保留图标,从“后退”按钮中删除文本相关的知识,希望对你有一定的参考价值。
我想从后退按钮中删除文本,但我想保留图标。我试过了
let backButton = UIBarButtonItem(title: "", style: UIBarButtonItemStyle.Plain, target: navigationController, action: nil)
navigationItem.leftBarButtonItem = backButton
但是,这会完全删除文本和图标。
@ rmd2的方法几乎是正确的,但您应该选择后退按钮指向的控制器的导航栏,并在后退按钮字段中键入" "
。
对于Swift 4+,将这些线条放入AppDelegate
的didFinishLaunchingWithOptions
let BarButtonItemAppearance = UIBarButtonItem.appearance()
BarButtonItemAppearance.setTitleTextAttributes([NSAttributedStringKey.foregroundColor: UIColor.clear], for: .normal)
BarButtonItemAppearance.setBackButtonTitlePositionAdjustment(UIOffsetMake(-200, 0), for:UIBarMetrics.default)
在快速4
self.navigationController?.navigationBar.topItem?.title = ""
如果您有一个ViewControllerA并且想要导航到ViewControllerB,那么在ViewControllerA中,您应该在推送到另一个视图控制器之前将当前navigationItem设置为新的UIBarButtonItem并将标题设置为带空格的字符串:
将标题设置为带空格的字符串,您不能设置nil或“”(空字符串),因为默认值为nil
let backItem = UIBarButtonItem()
backItem.title = " "
navigationItem.backBarButtonItem = backItem
let controllerB = ViewControllerB()
navigationController?.pushViewController(controllerB, animated: true)
let button: UIButton = UIButton (type: UIButtonType.Custom)
button.setImage(UIImage(named: "imageName"), forState: UIControlState.Normal)
button.addTarget(self, action: "backButtonPressed:", forControlEvents: UIControlEvents.TouchUpInside)
button.frame = CGRectMake(0, 0, 30, 30)
let barButton = UIBarButtonItem(customView: button)
self.navigationItem.leftBarButtonItem = barButton
func backButtonPressed(btn : UIButton) {
// Your code
}
将此代码放在每个推送另一个VC的VC中
navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
要从导航控制器堆栈中的所有viewcontrollers中删除:
子类UINavigationController并添加:
override func show(_ vc: UIViewController, sender: Any?) {
setEmptyBackButton(vc)
super.show(vc, sender: sender)
}
override func pushViewController(_ viewController: UIViewController, animated: Bool) {
setEmptyBackButton(viewController)
super.pushViewController(viewController, animated: animated)
}
func setEmptyBackButton(_ viewController: UIViewController) {
viewController.navigationItem.backBarButtonItem =
UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}
有时,如果标题很长,它不会仅改变标题颜色。因为它可能会将导航栏标题向左移动。因此,为了防止它,您可能需要水平移动条形按钮标题,并使其透明:
let barButtonItemAppearance = UIBarButtonItem.appearance()
barButtonItemAppearance.setTitleTextAttributes([NSAttributedStringKey.foregroundColor: UIColor.clear], for: .normal)
barButtonItemAppearance.setBackButtonTitlePositionAdjustment(UIOffsetMake(-200, 0), for:UIBarMetrics.default)
对我来说这就是诀窍:
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(true)
self.navigationItem.title = " "
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.navigationItem.title = "my amazing title"
navigationItem.backBarButtonItem = UIBarButtonItem(title: " ", style: .plain, target: nil, action: nil)
}
请注意,如果您只设置标题而不修改backBarButtonItem,它似乎可以工作。但是如果您尝试使用手势返回而不是取消并停留在推动的视图控制器上,则后面的标题将会返回。
在Swift工作4
您应该选择后退按钮指向的控制器FROM的导航栏,然后在后退按钮字段中键入“”。
例如,如果要将A控制器推送到B控制器,请在A控制器导航栏中输入空格。
Xcode 10,Swift 4+
这里的其他人也有类似的答案,但值得注意的是,如果文本仍未清除,则必须单击“空格”,然后单击“输入”。
我知道这已经有了答案,但您也可以在代码中执行此操作(如果您正在使用nib)
navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
在第一个视图控制器中添加上面的内容。
请注意,您需要为每个正在推送的视图控制器执行此操作。因此,如果您有3个视图控制器,并且想要从所有视图控制器中删除背面文本,则必须在视图控制器1和2中添加该行。
在使用Swift的Xcode 9.2中,它的工作方式如下:
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(true)
navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}
对于我们没有控制所有先前视图控制器的情况(即,如果我们在框架中工作),我们可以删除后退按钮的标题,如下所示:
// For ios 10
navigationController?.navigationBar.items?.last?.backBarButtonItem?.title = String()
// For iOS 11
navigationController?.navigationBar.items?.last?.backBarButtonItem?.title = nil
它的作用是导航到导航堆栈的最后一项并删除其后标题。当我们的视图控制器出现时,请务必保存原始的:
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
originalBackButtonTitle = navigationController?.navigationBar.items?.last?.backBarButtonItem?.title
// Delete title somewhere here...
}
然后重新分配它,以免破坏应用程序的任何部分:
override func viewWillDisappear(_ animated: Bool) {
navigationController?.navigationBar.items?.last?.backBarButtonItem?.title = originalBackButtonTitle
super.viewWillDisappear(animated)
}
这将解决您的问题:
import UIKit
extension UINavigationController{
func customizeBackArrow(){
let yourBackImage = UIImage(named: "icon_back_arrow")
self.navigationBar.backIndicatorImage = yourBackImage
self.navigationBar.tintColor = Common.offBlackColor
self.navigationBar.backIndicatorTransitionMaskImage = yourBackImage
navigationItem.leftItemsSupplementBackButton = true
self.navigationBar.topItem?.backBarButtonItem = UIBarButtonItem(title: "",
style: .plain, target: self, action: nil)
}
}
我已经尝试了几个答案,我无法让它们在所有情况下都能正常工作。因此,这是一种解决方法,如果设置了导航栏的标题,则不会影响它的标题。
guard let items = viewController.navigationController?.navigationBar.items else { return }
for item in items {
if item.title == nil {
item.title = ""
}
}
细节
- Xcode版本10.2.1(10E1001),Swift 5
解
1.创建UINavigationController的自定义类
import UIKit
class NavigationController: UINavigationController {
override func viewDidLoad() {
super.viewDidLoad()
delegate = self
}
}
extension NavigationController: UINavigationControllerDelegate {
func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
if viewController.navigationItemBackButtonTextIsHidden {
viewController.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}
}
}
2.添加UIViewController扩展
import UIKit
extension UIViewController {
@objc var navigationItemBackButtonTextIsHidden: Bool { return false }
}
3.更新ViewController类
import UIKit
class ViewController: UIViewController {
override var navigationItemBackButtonTextIsHidden: Bool { return true }
}
完整样本
import UIK以上是关于保留图标,从“后退”按钮中删除文本的主要内容,如果未能解决你的问题,请参考以下文章
如何从iOS中保留后退图标的LeftNavigation Bar按钮中删除后退文本[重复]