Представьте модальный контроллер вида с прозрачным фоном


Я хочу представить UIViewController программно, который должен отображаться (или нет, скорее) с прозрачным фоном. Я хочу его для iOS 7.0 и выше. Я нашел себе много вопросов (и ответов), но они не смогли мне помочь. Вот иерархия представлений моего приложения.

Я использую контроллер бокового меню (RESideMenu).

У меня есть rootView (база из RESideMenu) ->, показывающий центральный контроллер (вместе с контроллером левого вида) в UINavigationController.

В требованиях, я хотел бы представить контроллер представления

Из толкаемого контроллера вида (в навигационной иерархии)

Из представленного контроллера вида (в навигационной иерархии)

Кроме того, мне нужно представить его и выполнить какое-то действие, а затем удалить его. Я почти уверен, что это должно работать во многих случаях, с (или без) боковым меню или даже навигационным контроллером.

Я помещаю отдельный вопрос (и, конечно, его ответ тоже) в эту очередь, потому что я думаю, что это будет полезно для разработчиков сообщества, которые также могут быть разочарованы отсутствием приемлемого решения этой проблемы.

1 9

1 ответ:

Предположим, мы находимся в FirstViewController

//Obj-C
- (void) presentSecondVC {
    SecondViewController *vc = [[SecondViewController alloc] init];
    [self addChildViewController:vc];
    [self didMoveToParentViewController:vc];
}

//Swift
func presentSecondVC() {
    let vc = SecondViewController.init()
    self.addChildViewController(vc)
    self.didMove(toParentViewController: vc)
}

Некоторым из вас, возможно, потребуется написать выше метод, как это,

//Obj-C
- (void) presentSecondVC {
    SecondViewController *vc = [[SecondViewController alloc] init];
    vc.view.frame = CGRectMake(0,0,width,height); //Your own CGRect
    [self.view addSubview:vc.view]; //If you don't want to show inside a specific view
    [self addChildViewController:vc];
    [self didMoveToParentViewController:vc];
    //for someone, may need to do this.
    //[self.navigationController addChildViewController:vc];
    //[self.navigationController didMoveToParentViewController:vc];   
}

//Swift
func presentSecondVC() {
    let vc = SecondViewController.init()
    vc.view.frame = CGRect.init(x: 0, y: 0, width: width, height: height) //Your own CGRect
    self.view.addSubview(vc.view) //If you don't want to show inside a specific view.
    self.addChildViewController(vc)
    self.didMove(toParentViewController: vc)
    //for someone, may need to do this.
    //self.navigationController?.addChildViewController(vc)
    //self.navigationController?.didMove(toParentViewController: vc)
}

Теперь в SecondViewController, Когда вы хотите вернуться

//Obj-C
- (void) goBack {
    [self removeFromParentViewController];
}

//Swift
func goBack() {
    self.removeFromParentViewController()
}

Играйте хорошо (с каждым сценарием):)

И да, это не будет показывать анимацию, в моем случае, я показываю пользовательское всплывающее окно внутри vc, хотя это выглядит хорошо с этим кодом!