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 自定义返回按钮的主要内容,如果未能解决你的问题,请参考以下文章