iOS 8 自定义返回按钮

Posted

技术标签:

【中文标题】iOS 8 自定义返回按钮【英文标题】:iOS 8 Custom Back Button 【发布时间】:2014-12-29 20:04:52 【问题描述】:

我在 ios 7 中制作了一个应用程序,当我切换到 Xcode 6.1 和 iOS 8.1 时,我的自定义后退按钮不再出现,而是只显示以前的视图控制器标题——这是默认设置。

我正在使用:

self.navigationItem.backBarButtonItem.title = @"";
self.navigationItem.backBarButtonItem.tintColor = [UIColor whiteColor];

这不再有效,我确保设置了代表...(分别在 .h 和 .m 中)

.h

<UINavigationControllerDelegate, UINavigationBarDelegate>

.m

 self.navigationController.delegate = self;

我不知道你在 iOS8 中是否有不同的做法,我搜索了董事会,似乎只能弄清楚如何隐藏后退按钮。我知道你必须在父 VC 中设置后退按钮文本,以便我在两个 VC 中包含相同的代码。

这段代码有效,所以我知道我有能力与我的导航栏通信,所以我在那里没有问题......

self.navigationItem.title = @"New <type>";

谢谢

【问题讨论】:

您是要制作自定义后退按钮,还是只是更改您的一个视图控制器导航栏上的后退按钮的文本? 我只是想更改文本,抱歉我应该说得更清楚。 【参考方案1】:

有时使用 barButtonItems,您只需要制作新的,而不是修改旧的。我试过你的代码,它也对我不起作用。这有效

- (void)viewWillAppear:(BOOL)animated 
    [super viewWillAppear:animated];
    UIBarButtonItem *item = [[UIBarButtonItem alloc] init];
    item.title = @"Title";
    self.navigationItem.backBarButtonItem = item;

编辑

此代码需要在前一个视图控制器中,而不是具有后退按钮的视图控制器中。前任。如果 viewController A 转到 viewController B 并且您希望视图控制器 B 上的后退按钮显示“Backy”而不是 viewController A 的标题,那么您实际上将此代码放在 viewController A 中,而不是 viewController B 中

编辑 2

要动态更改视图控制器的后退按钮标题,请在推送视图控制器之前替换 backBtn,并为其赋予适当的标题。

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) 
    let barBtnItem = UIBarButtonItem()
    navigationItem.backBarButtonItem = barBtnItem
    if segue.identifier == "seg1" 
        barBtnItem.title = "Hello 1"
     else if segue.identifier == "seg2" 
        barBtnItem.title = "Hello 2"
    

【讨论】:

抱歉耽搁了,我要试试你的代码。谢谢! @VanDuTran 我更新了我的答案以解释代码的放置位置 我明白了。谢谢。如果我的 viewController A 可以推送 viewController B 和 viewController C,你知道有没有办法给 viewController B 和 viewController C 一个不同的返回按钮标题? @VanDuTran 更改 viewController A 的后退按钮(影响 viewController B),并更改 viewController B 的后退按钮(影响 viewController C)。 @Alex 抱歉,我不清楚。我的意思是,viewController A 可以推送 viewController B,viewController A 可以推送 viewController C。所以 viewController A 是 B 和 C 的父级。【参考方案2】:

我需要四样东西 [Swift]

使用我的自定义后退按钮图像 不显示任何文本(如“后退”或“最后一个控制器的标题”) 系统范围,例如所有的后退按钮都是这样的 干燥(不要重复自己)

另外,因为我经常这样做,而且它非常复杂,我每次都必须查找它,所以我做了一个分类。

在 AppDelegate.appDidFinishLaunching.... 中调用:

UINavigationBar.customBackButtonSetup("iconBackArrow", hideText: true)

在自己的文件中添加这个扩展,比如 UINavigationBar+CustomBackButton:

extension UINavigationBar 

    // call this once at app start
    class func customBackButtonSetup(backButtonImageName: String, hideText: Bool) 
        // Custom back button
        let insets = UIEdgeInsets(top: 0, left: 0, bottom: -2.5, right: 0) // might have to modify this to perfect vertical alignments
        let backIndicator = UIImage(named: backButtonImageName)!.imageWithRenderingMode(.AlwaysOriginal).imageWithAlignmentRectInsets(insets)
        UINavigationBar.appearance().backIndicatorImage = backIndicator;
        UINavigationBar.appearance().backIndicatorTransitionMaskImage = backIndicator

        if hideText 
            let barAppearace = UIBarButtonItem.appearance()
            barAppearace.setBackButtonTitlePositionAdjustment(UIOffsetMake(0, -100), forBarMetrics:UIBarMetrics.Default)
        

    

【讨论】:

【参考方案3】:

iOS 8+ Swift 版本(可以毫不费力地转换为 ObjC)。此方法保留了与标准后退按钮相关的导航栏的所有优点和行为(推/弹出动画、交互式弹出手势等)

// Call the code ONE TIME somewhere on app launch to setup custom back button appearance
UINavigationBar.appearance().tintColor = UIColor.blackColor()
// If you need custom positioning for your back button, in this example button will be 1 px up compared to default one
// Also only vertical positioning works, for horizontal add offsets directly to the image
let backImageInsets = UIEdgeInsetsMake(0, 0, -1, 0)
// Get image, change of rendering (so it preserves offsets made in file), applying offsets
let backImage = UIImage(named: "YourButtonImageAssetFileName")?.imageWithRenderingMode(.AlwaysOriginal).imageWithAlignmentRectInsets(backImageInsets)
// Setting images
UINavigationBar.appearance().backIndicatorImage = backImage
UINavigationBar.appearance().backIndicatorTransitionMaskImage = backImage

// Call EACH TIME BEFORE pushing view controller if you don't need title near your back button arrow
self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .Plain, target: nil, action: nil)
// Push controller
self.navigationController?.pushViewController(vc, animated: true)

【讨论】:

以上是关于iOS 8 自定义返回按钮的主要内容,如果未能解决你的问题,请参考以下文章

iOS手势(滑动)返回的实现(自定义返回按钮)

iOS 自定义返回按钮,保留系统滑动返回

iOS-自定义NavigationItem返回按钮pop返回按钮

iOS 自定义返回按钮,保留系统滑动返回

iOS_自定义返回按钮

IOS 自定义导航栏标题和返回按钮标题