我正在尝试实现一个俯卧撑UINavigationBar,其中导航栏的位置附加到UIScrollView的contentOffset(类似于safari在ios7中的工作方式)。
为了让动态运动正常工作,我使用以编程方式创建的UINavigationBar并添加为UIViewController的view
的子视图(可以self.navbar
访问)。
UIViewController位于UINavigationController层次结构中,因此我将内置self.navigationController.navigationBar
隐藏在-viewWillAppear:
的顶部。
我想解决的问题是在这个新的独立导航栏中添加一个后退按钮。我最好只想从navigationController及其隐藏的内置导航栏中复制按钮甚至navigationItems,但这似乎无法正常工作
我的唯一解决方案是将我的独立导航栏上的leftBarButtonItem设置为假后退按钮(当navController的导航栏中有backItem时)?这看起来有点hacky,我宁愿使用内置的backButton功能。
答案 0 :(得分:3)
另一种方法是,一旦拥有自己的UINavigationBar
设置,就会在导航栏上推送两个UINavigationItems
,从而导致显示后退按钮。然后,您可以自定义按下后退按钮时发生的情况。
以下是我的表现
1 - 一些UINavigationItem
子类,用于定义额外行为/自定义参数
@interface MyNavigationItem : UINavigationItem
//example : some custom back action when 'back' is pressed
@property (nonatomic, copy) void (^onBackClickedAction)(void);
@end
2 - 然后将其连接到UINavigationBarDelegate
:
- (BOOL)navigationBar:(UINavigationBar *)navigationBar shouldPopItem:(UINavigationItem *)item
{
if ([item isKindOfClass:[MyNavigationItem class]]) {
MyNavigationItem *navItem = (MyNavigationItem *)item;
//custom action
if (navItem.backAction) {
navItem.backAction();
}
return YES;// return NO if you don't want your bar to animate to previous item
} else {
return YES;
}
}
您可以调整该方案,在后退操作上调用UINavigationController pop 方法。 这仍然是hacky
答案 1 :(得分:1)
Vinzzz的回答是一个很好的解决方案。这是我的实现,因为上下文略有不同。
在UIViewController的viewDidLoad
方法中,我设置了导航栏的导航项目如下:
NSMutableArray* navItems = [@[] mutableCopy];
if (self.navigationController.viewControllers.count > 1)
{
NSInteger penultimateIndex = (NSInteger)self.navigationController.viewControllers.count - 2;
UIViewController* prevVC = (penultimateIndex >= 0) ? self.navigationController.viewControllers[penultimateIndex] : nil;
UINavigationItem* prevNavItem = [[UINavigationItem alloc] init];
prevNavItem.title = prevVC.title;
[navItems addObject:prevNavItem];
}
UINavigationItem* currNavItem = [[UINavigationItem alloc] init];
... <Add any other left/right buttons to the currNavItem> ...
[navItems addObject:currNavItem];
[self.navbar setItems:navItems];
...其中self.navbar
是我的浮动独立UINavigationBar。
我还将当前视图控制器指定为self.navbar
的委托,然后监听按下后退按钮时触发的-navigationBar:shouldPopItem:
事件:
- (BOOL)navigationBar:(UINavigationBar *)navigationBar shouldPopItem:(UINavigationItem *)item
{
if (navigationBar == self.navbar)
{
[self.navigationController popViewControllerAnimated:YES];
return NO;
}
return YES;
}
(如果您返回YES
,则在ios7中使用滑动手势时会崩溃。