0

我正在尝试实现将出现在页面底部的警报/通知栏,单击时将向上滚动并覆盖整个屏幕(就像 Kayak 或 PageOnce 应用程序显示它一样)。这是它现在的样子(已在以下 URL 上传图片):

图片显示底部的警报栏 http://www.anony.ws/hLe

警报栏打开 http://www.anony.ws/hLl

它有效但不完全。一件事,警报视图无法覆盖导航栏(警报框架的原点 y 在所附屏幕截图中为 0 打开视图)。如果我将框架的 y 设为负值以进一步向上,则视图将位于导航栏的后面。我怎样才能让它工作,以便警报视图覆盖整个屏幕(包括导航栏)。

这是我所做的:

  1. 在“会员中心”视图控制器中,在 viewDidLoad 上,我正在创建一个新视图(我的 AlertView),将其框架更改为显示在底部,然后将其作为子视图添加到当前视图:

    CGFloat alertBarHeight = 25;
    CGRect frame = self.view.frame;
    frame.origin.y = frame.size.height - alertBarHeight;
    AlertsView *av = [[AlertsView alloc] initWithFrame:frame withController:self height:alertBarHeight]; // Its a custom init method that just stores a reference to the invoking controller
    [self.view addSubview:av];
    
  2. 我的显示/隐藏代码在 AlertsView.m 中,如下所示:

    - (void) showOrHideAlerts:(id)sender
    {
    if (self.isOpen)
    {
        // Close the alerts view
        [UIView animateWithDuration:0.4 delay:0 options:UIViewAnimationOptionCurveEaseOut
        animations:^{
            CGRect frame = self.frame;
            frame.origin.y = self.invokingController.view.frame.size.height - self.barHeight;
            self.frame = frame;
        }
        completion:^(BOOL finished)
        {
             self.isOpen = NO;
        }];
    }
    else
    {
        // Show the alerts view
        [UIView animateWithDuration:0.4 delay:0 options:UIViewAnimationOptionCurveEaseOut
        animations:^{
            CGRect frame = self.frame;
            frame.origin.y = 0;// - [self.invokingController.navigationController navigationBar].frame.size.height;
            //frame.origin.y = 20;
            self.frame = frame;
        }
        completion:^(BOOL finished)
        {
             self.isOpen = YES;
        }];
    
    }
    }
    

我觉得我没有正确实施它。请指导我实现此类功能的最佳方式。

4

2 回答 2

0

您可以在警报视图打开时隐藏导航栏,并在警报视图关闭时再次显示它。

隐藏 :

[self.navigationController setNavigationBarHidden:YES animated:NO];

显示:

self.navigationController setNavigationBarHidden:NO animated:NO];

希望能帮助到你。

于 2012-12-18T07:56:36.073 回答
0

如下将警报视图添加到导航控制器视图中,而不是在当前视图中:

AlertsView *av = [[AlertsView alloc] initWithFrame:frame withController:self height:alertBarHeight]; // Its a custom init method that just stores a reference to the invoking controller

[self.navigationController.view addSubview:av];
于 2012-12-18T08:01:41.257 回答