当我按下a时UIViewController
,它在new的后退按钮中有一些标题UIViewController
,如果标题中包含很多文本,则在iPhone 4s中看起来不太好,所以我想删除它。
如果我在prepareForSegue
函数中添加一些代码,那将是一个麻烦。
还有更好的方法吗?
当我按下a时UIViewController
,它在new的后退按钮中有一些标题UIViewController
,如果标题中包含很多文本,则在iPhone 4s中看起来不太好,所以我想删除它。
如果我在prepareForSegue
函数中添加一些代码,那将是一个麻烦。
还有更好的方法吗?
Answers:
如果你想后退箭头使下面的代码投产AppDelegate
文件导入didFinishLaunchingWithOptions
方法。
For Objective-C
[[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(0, -60) forBarMetrics:UIBarMetricsDefault];
For Swift
let BarButtonItemAppearance = UIBarButtonItem.appearance()
BarButtonItemAppearance.setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.clear], for: .normal)
另一个选择在下面给出。
在 Objective C
self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil];
在 Swift
self.navigationItem.backBarButtonItem = UIBarButtonItem(title:"", style:.plain, target:nil, action:nil)
更新:
let BarButtonItemAppearance = UIBarButtonItem.appearance()
let attributes: [NSAttributedStringKey: Any] = [
BarButtonItemAppearance.setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.clear], for: .normal)
NSAttributedStringKey.font: UIFont.systemFont(ofSize: 0.1),
NSAttributedStringKey.foregroundColor: UIColor.clear]
BarButtonItemAppearance.setTitleTextAttributes(attributes, for: .normal)
BarButtonItemAppearance.setTitleTextAttributes(attributes, for: .highlighted)
更新SWIFT 4.1:
let attributes = [NSAttributedStringKey.font: UIFont(name: "Helvetica-Bold", size: 0.1)!, NSAttributedStringKey.foregroundColor: UIColor.clear]
BarButtonItemAppearance.setTitleTextAttributes(attributes, for: .normal)
BarButtonItemAppearance.setTitleTextAttributes(attributes, for: .highlighted)
使用偏移
UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffsetMake(-1000, 0), for:UIBarMetrics.default)
因此可能是您的问题已解决。
快乐的编码。
setBackButtonTitlePositionAdjustment
并非总是有效,当后退按钮标题很长,但又不足以更改为“返回”时,中间的标题将向右移动。
setBackButtonTitlePositionAdjustment:forBarMetrics:
如果用户已从辅助功能设置中启用了按钮形状,则形状将显示出来,最终导致丑陋的导航栏。
Swift 3上的工作就像魅力
self.navigationController?.navigationBar.topItem?.title = " "
navigationController?.pushViewController(_, animated:)
viewWillAppear:
。
我正在使用成行的方法将AppDelegate
文件中的这一行代码didFinishLaunchingWithOptions
删除backbutton title
。
斯威夫特2.x
let barAppearace = UIBarButtonItem.appearance()
barAppearace.setBackButtonTitlePositionAdjustment(UIOffsetMake(0, -60), forBarMetrics:UIBarMetrics.Default)
斯威夫特3.x
UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffsetMake(0, -60), for:UIBarMetrics.default)
斯威夫特4.x
UIBarButtonItem.appearance().setTitleTextAttributes([NSAttributedStringKey.foregroundColor: UIColor.clear], for: .normal)
UIBarButtonItem.appearance().setTitleTextAttributes([NSAttributedStringKey.foregroundColor: UIColor.clear], for: UIControlState.highlighted)
setBackButtonTitlePositionAdjustment
并非总是有效,当后退按钮标题很长,但又不足以更改为“返回”时,中间的标题将向右移动。
只需从其他ViewController所依赖的地方转到您的Parent ViewController。
override func viewWillDisappear(animated: Bool) {
super.viewWillDisappear(true)
navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .Plain, target: nil, action: nil)}
只需将代码复制到 didFinishLaunchingWithOptions launchOptions
UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffset(horizontal: -1000.0, vertical: 0.0), for: .default)
UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffsetMake(-1000.0, 0.0), for: .default)
您可以为所有UIViewController
想要此行为的子类创建一个子类,并在子类的中viewDidLoad
:
override func viewDidLoad() {
super.viewDidLoad()
self.navigationItem.backBarButtonItem = UIBarButtonItem(
title: "", style: .plain, target: nil, action: nil)
}
这样,您可以选择要针对其执行操作的控制器,而无需复制代码。我希望我的控制器仅说“ Back”,而不是前一个控制器的标题,因此我在此处设置该标题。
以从中得到启发rordulu的答案在这里,我最终创建一个自定义的UINavigationController和UINavigation酒吧,似乎处理这个棘手的问题的所有情况。
1)UINavigationController
使用您的自定义进行初始化UINavigationBar
:
class CustomNavigationController: UINavigationController {
convenience init() {
self.init(navigationBarClass: CustomNavigationBar.self, toolbarClass: nil)
}
}
2)backItem.title
每次视图布局时,将导航栏的属性设置为空字符串
class CustomNavigationBar: UINavigationBar {
override func layoutSubviews() {
backItem?.title = ""
super.layoutSubviews()
}
}
现在,每次使用此导航控制器和条形组合时,它都不会包含后退按钮文字!🎉
注意:如果还使用情节提要板,这应该可以正常工作,只需确保将自定义导航栏组件放到视图中
我通常在UIViewController的viewDidLoad中添加或更改后退按钮。
这样的事情应该起作用:
let leftButton = UIBarButtonItem(title: "Back", style: UIBarButtonItemStyle.Plain, target: self, action: "closeView:")
self.navigationItem.leftBarButtonItem = leftButton
不要忘记更改并实现关闭视图的调用功能。
甚至更容易,只需更改标题:
self.navigationItem.leftBarButtonItem.title = "Back"
斯威夫特3:
self.navigationItem.backBarButtonItem = UIBarButtonItem(title:"", style:.plain, target:nil, action:nil)
在这里添加第二个答案,因为我的第一个答案仅部分起作用。该方法不太优雅,因为它需要在应用程序的每个视图中调用一个方法,但是它的工作没有任何副作用。
因此,首先,创建一个具有函数的UIViewController扩展类,以删除后退按钮文本并添加自定义后退按钮:
extension UIViewController {
func setBackButton() {
navigationController?.navigationBar.backIndicatorImage = R.image.backArrow()
navigationController?.navigationBar.backIndicatorTransitionMaskImage = R.image.backArrow()
navigationItem.backBarButtonItem = UIBarButtonItem(title: " ", style: .plain, target: nil, action: nil)
}
其次,我们可以简单地在viewDidLoad
需要它的每个视图控制器中调用该函数。
简单的解决方案:
当您从第一个控制器推入第二个控制器时,将self.navigationItem.title =“”放入第一个控制器的viewWillDisappear中。从第二个控制器隐藏后退按钮标题。
上面的陈述隐藏了第一个控制器的标题,因此当我们回来时,我们再次想要第一个控制器的标题。为此,我们在第一个控制器的viewWillAppear方法中添加了第一个控制器的标题。
请参阅以下方法(第一控制器的)
override func viewWillDisappear(_ animated: Bool) {
self.navigationItem.title = ""
}
override func viewWillAppear(_ animated: Bool) {
self.navigationItem.title = "Title"
}
斯威夫特4.2
UIBarButtonItem.appearance().setTitleTextAttributes([.foregroundColor: UIColor.clear], for: .normal)
更新了Swift 4.2的答案
与之UIAppearance
共事是解决问题的一种更干净的方法,但是它将导致所有UIBarButtonItem
内容清晰明了。该解决方案的改进版本可能是检查中是否UIBarButtonItem
包含UINavigationBar
。
UIBarButtonItem.appearance(whenContainedInInstancesOf: [UINavigationBar.self]).setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor.clear], for: .normal)
对于那些不想使用方法混乱或在不同的视图控制器中复制相似代码的人,我有一个简单的解决方案。
要删除后退按钮标题,请创建UINavigationController子类并重写pushViewController(_,animation :)方法:
final class CustomNavigationController: UINavigationController {
override func pushViewController(_ viewController: UIViewController, animated: Bool) {
super.pushViewController(viewController, animated: animated)
let backBarButtonItem = UIBarButtonItem()
backBarButtonItem.title = nil
viewController.navigationItem.backBarButtonItem = backBarButtonItem
}
}
我不知道为什么,但是在iPhone plus中发现隐藏后退按钮标题的问题,但在没有plus的设备中显示正确
leftBarButtonItem.title = ""
所以我找到了简单的方法。在自动布局中,将其颜色设置为在NavigationViewController的NavigationBar中清除。如果您使用带有色彩的图标或文本图块,则可能会出现问题。但就我而言,我不会全部使用它。
只需使用此:
func removeBackButton(vc:UIViewController) {
let button = UIButton.init(type: .custom)
button.setImage(UIImage.init(named:""), for: .normal)
let leftBarButton = UIBarButtonItem.init(customView: button)
vc.navigationItem.leftBarButtonItem = leftBarButton
}
因此,在viewDidLoad中调用此方法:
override func viewDidLoad() {
super.viewDidLoad()
removeBackButton(vc:self)
}
您可以将此扩展添加到UIViewController,然后在每个viewDidLoad()中调用此函数,例如:self.updateBackButton()
extension UIViewController {
func updateBackButton(){
if self.navigationController != nil {
self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .done, target: self, action: nil)
}
}}
我想分享一个对我有用的解决方案。另外,可以根据您的需要和要求进行调整。
请注意,就我而言,我使用情节提要来指定CustomNavigationBar
斯威夫特4.2
class CustomNavigationBar: UINavigationBar {
override func awakeFromNib() {
super.awakeFromNib()
guard let topItem = topItem else { return }
removeBackButtonTitle(for: topItem)
}
override func pushItem(_ item: UINavigationItem, animated: Bool) {
removeBackButtonTitle(for: item)
super.pushItem(item, animated: animated)
}
func removeBackButtonTitle(for item: UINavigationItem) {
item.backBarButtonItem = UIBarButtonItem()
}
}
适用于Swift 4.2
使用AppDelegate
文件中的代码行didFinishLaunchingWithOptions
UIBarButtonItem.appearance(whenContainedInInstancesOf: [UINavigationBar.self]).setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor.clear], for: .normal)
UIBarButtonItem.appearance(whenContainedInInstancesOf: [UINavigationBar.self]).setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor.clear], for: .highlighted)
只需UIViewController
使用覆盖功能创建扩展名,awakeFromNib()
然后UIBarButtonItem
使用空标题制作并赋予navigation backBarButtonItem
。
extension UIViewController {
open override func awakeFromNib() {
let backBarBtnItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
navigationItem.backBarButtonItem = backBarBtnItem
}
}
我找到了一个简单的解决方案:
在PersingtingViewController's
viewWillDisappear
方法jsut
self.title = ""
并设置title
为PersingtingViewController's
onviewWillAppear
方法。重复此为所有viewControllers
的navigationStack
,除了最后一个。
现在,在iOS 14上提供类中的backButtonDisplayMode
属性UINavigationItem
。因此,要删除后退按钮标题,您可以使用
navigationItem.backButtonDisplayMode = .minimal
在viewDidLoad
要删除它的viewController的功能中。
要在所有NavigationBar中将其删除,我使用了模糊处理技术
import UIKit
private let swizzling: (UIViewController.Type, Selector, Selector) -> Void = { forClass, originalSelector, swizzledSelector in
if let originalMethod = class_getInstanceMethod(forClass, originalSelector), let swizzledMethod = class_getInstanceMethod(forClass, swizzledSelector) {
let didAddMethod = class_addMethod(forClass, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod))
if didAddMethod {
class_replaceMethod(forClass, swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod))
} else {
method_exchangeImplementations(originalMethod, swizzledMethod)
}
}
}
extension UIViewController {
static func swizzle() {
let originalSelector1 = #selector(viewDidLoad)
let swizzledSelector1 = #selector(swizzled_viewDidLoad)
swizzling(UIViewController.self, originalSelector1, swizzledSelector1)
}
@objc open func swizzled_viewDidLoad() {
if let _ = navigationController {
if #available(iOS 14.0, *) {
navigationItem.backButtonDisplayMode = .minimal
} else {
// Fallback on earlier versions
navigationItem.backButtonTitle = ""
}
}
swizzled_viewDidLoad()
}
}
并在application(_:didFinishLaunchingWithOptions:)
通话中
UIViewController.swizzle()