在iPhone应用程序/ iOS中,如何制作一个透明的“加载”覆盖层,覆盖导航栏和键盘?

10

在 iPhone 应用程序 / iOS 中,我要如何制作一个透明的“加载”覆盖层来覆盖导航栏和键盘?

我尝试了下面的代码,但它既不能覆盖导航栏也不能覆盖键盘:

UIView *overlay = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 460)];
overlay.backgroundColor = [UIColor colorWithWhite:0 alpha:.5];
[self.view addSubview:overlay];

感谢


它不包括导航栏,因为您需要将子视图添加到self.navigationController.view中。有一个视图层次结构,比如1:顶部栏2:导航栏3:选项卡栏4:您的视图。 - Matej
5个回答

6
如果你想要一个简单的库来处理这个问题,David Sinclair的DSActivityView是不错的选择。

听起来不错,但如果我们使用他的代码,他需要得到信用,而且我不确定在应用程序中哪里可以放置制作者信息! - Chris
@Chris 当您提交代码时,您有机会修改与您的应用程序相关联的服务条款。如果您希望,您可以完全替换苹果使用的默认条款,但我只是保留现有的ToS,并添加与我使用的任何库相关的信用和许可证。此外,在应用程序的网站上,我会添加信用。在我看来,这两个结合起来就足够了,但即使只是修改ToS也应该足够。 - Matthew Frederick

4
有时候我懒得使用其他库,就只是这样做:
// create a custom black view
UIView *overlayView = [[UIView alloc] initWithFrame:self.navigationController.view.frame];
overlayView.backgroundColor = [UIColor blackColor];
overlayView.alpha = 0.8;
overlayView.tag = 88;

// create a label
UILabel *message = [[UILabel alloc] initWithFrame:self.navigationController.view.frame];
[message setFont:[UIFont fontWithName:@"HelveticaNeue-Light" size:25.0f]];
message.text = @"message to my dear user";
message.textColor = [UIColor whiteColor];
message.textAlignment = NSTextAlignmentCenter;
message.tag = 99;

// and just add them to navigationbar view
[self.navigationController.view addSubview:overlayView];
[self.navigationController.view addSubview:message];

然后调用一个方法来查找这些视图,将它们淡出并删除:
-(void) removeOverlayViews{
    UIView *view = (UIView *)[self.navigationController.view viewWithTag:88];
    UILabel *label = (UILabel *)[self.navigationController.view viewWithTag:99];

    [UIView animateWithDuration:0.5
         animations:^{
             view.alpha = 0.0;
             label.alpha = 0.0;
         }
         completion:^(BOOL finished){
             [view removeFromSuperview];
             [label removeFromSuperview];
         }
     ];
}

有时我只想在几秒钟内显示一条消息,所以在向导航控制器添加覆盖视图后立即调用此方法:

[self performSelector:@selector(removeOverlayViews) withObject:nil afterDelay:4];

2
您真是个牛人,这正是stackoverflow需要提供的,而不是那些非常不必要的库。人们想要轻松地知道如何做这么简单的事情,而不是使用库。您让我的夜晚变得更加轻松,谢谢您。基于此,我构建了自己的自定义旋转加载覆盖层 ;) - thekevshow
2
同意。请提供更多不涉及库的答案!我们应该教授如何编写代码,而不是如何使用预先构建的东西。 - SPillai

2
请将其添加到self.view.window中。但这可能无法覆盖键盘。在这种情况下,您需要创建自己的窗口。尽管苹果不推荐这样做。这意味着:在实现时要小心和彻底。

2

0

您可以尝试使用操作表而不是透明视图进行加载:

actionSheetLoad = [[UIActionSheet alloc] initWithTitle:@"Loading..Please wait" delegate:nil cancelButtonTitle:nil destructiveButtonTitle:nil otherButtonTitles:nil];

[actionSheetLoading showInView:showInView];

操作表会覆盖整个视图,直到后台任务(例如从服务器获取数据/访问URL)完成。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接