2013-06-14 3 views
0

Это типичный вопрос и, возможно, дублированный, но ...Как показать UIViewController в другом UIViewController?

Приложение iPad, которое имеет UINavigationBar и UITabBar. Я создал кнопку на navigationBar, которая должна показать appinfoViewController.

Когда я представляю его navigationBar, и tabTab по-прежнему доступны для нажатия. Но я хотел бы показать appinfoViewController к основному размеру экрана ПОЛНОГО приложения (как модальный)

Это мой код:

- (void)showInfo 
{ 
AboutViewController *about = [[AboutViewController alloc] init]; 
[about.view setFrame: self.view.frame]; 
[about.view setAlpha:0.0]; 

[UIView animateWithDuration:0.5 
         delay:0.0 
        options: UIViewAnimationOptionCurveLinear 
       animations:^{ 
        [about.view setAlpha:1.0]; 

        [self.view addSubview:about.view]; 
        [self addChildViewController:about]; 
        [about didMoveToParentViewController:self]; 
       } 
       completion:^(BOOL finished){ 

       }]; 
} 

Как представить appinfoViewController на весь экран?

Может быть, это можно представить модально, но без ЧЕРНОГО фона?

+0

addSubview отличается addChildViewController. Я имею в виду: вы можете создать экземпляр контроллера и добавить его представление (только представление) в другой контроллер. Первый контроллер все еще существует и управляет вашим представлением, даже если он не находится в исходной иерархии представления контроллера. Но для модальной презентации вы можете попробовать: '[self presentViewController: about animated: YES complete: nil]' – zbMax

+0

Пробовал ли 'presentViewController' для представления viewcontroller как модального? –

+0

да, но 'presentViewController' имеет черный фон .. но мне нужна прозрачность – Romowski

ответ

1

Как указывается в комментариях, используя

[self presentViewController:about animated:YES completion:nil] 

бы избавиться от навигационной панели и панели вкладок. Если вам нужно, чтобы держать их, вам нужно использовать

[self.navigationController pushViewController:about animated:YES]; 

EDIT:

Для того, чтобы иметь взаимодействие с пользователем отключено везде для о целях, за исключением, это немного сложнее: прежде всего, вы должны иметь все элементы пользовательского интерфейса, встроенные в представление, которое не является основным видом вашего представления контроллера представления.

Предположим, у вас есть только кнопка (кнопка «показать»), вы бы просто не разместили ее в своем главном представлении, но вы бы использовали другой вид (назовем его «внешним видом»), который просто размером с вид контроллера контроллера и где вы помещаете кнопку (вместе с любым другим элементом ui, который у вас может быть). Вам также нужен выход на этот внешний вид. Затем напишите такой метод, как:

-(void)userInteractionEnabled:(BOOL)enabled 
{ 
    self.navigationController.navigationBar.userInteractionEnabled = enabled; 
    self.tabBarController.tabBar.userInteractionEnabled = enabled; 
    self.outerView.userInteractionEnabled = enabled; 
} 

В качестве альтернативы вы можете просто отключить каждую «интерактивную» розетку вместо внешнего вида. Так, если, например, у вас есть 2 текстовых изображения, 3 кнопки и один UIPickerView, вы должны установить userInteractionEnabled = enabled для каждой из этих точек (вместо того, чтобы делать это только для родительского представления).

Теперь в вашем методе ShowInfo вы можете иметь:

CGRect frame = CGRectMake(50, 50, 200, 200); //Use whatever origin and size you need 
about.view.frame = frame; 
[self.view addSubview:about.view]; 
[self userInteractionEnabled:NO] 

И в методе btnClose вы можете просто положить:

[about.view removeFromSuperview]; 
[self userInteractionEnabled:YES]; 

Я надеюсь, что это помогает, дайте мне знать, если это то, что тебе нужно было!

P.S. Возможно, вы уже знаете об этом, но есть класс UIPopoverController, доступный только для приложений iPad, что в значительной степени сделает все это за вас. Вы можете найти учебник о том, как его использовать. here.

+0

первый закрывается со всех сторон черным фоном ( – Romowski

+0

вы используете раскадровку? – micantox

+0

да, но ** appinfoViewController ** - это отдельный XIB – Romowski

0
UIStoryboard *storyBoard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle:nil]; 

    AboutViewController *about = (AboutViewController *)[storyBoard instantiateViewControllerWithIdentifier:@"about"]; 

[self.navigationController pushViewController: об анимированном: ДА];

0

Вы можете добавить слой вида viewcontroller непосредственно к представлению viewcontroller.

Код должен выглядеть -

AboutViewController *about = [[AboutViewController alloc] init]; 
[about.view setFrame: self.view.bound]; 
[about.view setAlpha:0.0]; 
[self.view addSubview:about.view]; 

[UIView animateWithDuration:0.5 
         delay:0.0 
        options: UIViewAnimationOptionCurveLinear 
       animations:^{ 
        [about.view setAlpha:1.0]; 
       } 
       completion:^(BOOL finished){ 

       }]; 
Смежные вопросы