0

我正在尝试实现一个上推式 UINavigationBar,其中导航栏的位置附加到 UIScrollView 的 contentOffset(类似于 safari 在 ios7 中的工作方式)。

为了使动态运动正常工作,我使用了一个以编程方式创建并添加为 UIViewController 的子视图的 UINavigationBar view(它可以作为 访问self.navbar)。

UIViewController 位于 UINavigationController 层次结构中,因此我将内置隐藏self.navigationController.navigationBar-viewWillAppear:.

我要解决的问题是为这个新的独立导航栏添加一个后退按钮。我宁愿简单地从 navigationController 及其隐藏的内置导航栏中复制按钮甚至是 navigationItems,但这似乎不起作用

我唯一的解决方案是将独立导航栏上的 leftBarButtonItem 设置为假后退按钮(当导航控制器的导航栏中有 backItem 时)?这似乎有点 hacky,我宁愿使用内置的 backButton 功能。

4

2 回答 2

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

于 2013-10-10T09:45:17.123 回答
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;
}

(如果你 return YES,它会在 ios7 中使用滑动手势时崩溃)。

于 2013-10-10T13:16:25.273 回答