В iphone app/ios, как сделать прозрачную "загрузку" наложения, которая покрывает навигационную панель и клавиатуру?

В iphone app/ios, как сделать прозрачную "загрузку" наложения, которая охватывает панель навигации и клавиатуру?

Я пробовал следующее, но он не охватывает ни навигационную панель, ни клавиатуру:

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

Спасибо

Ответ 1

Если вам нужна простая библиотека, которая позаботится об этом, это будет хорошо. Дэвид Синклер DSActivityView.

Ответ 2

иногда, когда я ленив использовать другие библиотеки, я просто делаю это:

// 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];
         }
     ];
}

иногда я просто хочу показать сообщение в течение нескольких секунд, поэтому я вызываю это сразу после добавления оверлейных представлений в navigationController:

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

Ответ 3

Добавьте его вместо self.view.window. Однако это может не покрыть клавиатуру. В этом случае вам нужно создать собственное окно. Хотя это не рекомендуется Apple. Это означает: будьте осторожны и основательны в своей реализации.

Ответ 5

Вы можете попробовать листок действий вместо прозрачного представления для загрузки:

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

[actionSheetLoading showInView:showInView];

В листе действий будет отображаться весь вид до тех пор, пока не будут запущены фоновые задачи времени (например, выборка данных с сервера/удаленных URL-адресов).