¿Es posible mostrar un SFSafariViewController dentro de un UITabBarController?

Quiero cargar SFSafariViewController dentro de una pestaña, por lo que la barra de tabs se encuentra en la parte inferior de toda la vista de Safari.

es posible? Intenté esto sin suerte:

 [self.tabBarController presentViewController:sfController animated:YES completion:nil]; 

¿Se requiere que la vista de Safari sea de pantalla completa?

Pude lograr esto programáticamente. La key para no tener la superposition UITabBar encima de su UIViewController es establecer translucent a NO :

En tu AppDelegate.m:

 @import SafariServices; // ... - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch. self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; UITabBarController *tabBarController = [[UITabBarController alloc] init]; tabBarController.tabBar.translucent = NO; SFSafariViewController *firstVC = [[SFSafariViewController alloc] initWithURL:[NSURL URLWithString:@"http://stackoverflow.com"]]; firstVC.title = @"SFSafariViewController"; UIViewController *secondVC = [[UIViewController alloc] init]; secondVC.view.backgroundColor = [UIColor blueColor]; secondVC.title = @"Blue VC"; tabBarController.viewControllers = @[firstVC, secondVC]; self.window.rootViewController = tabBarController; [self.window makeKeyAndVisible]; return YES; } 

Usando la respuesta de JAL como base, pude implementar esto yo mismo en una aplicación que ya tenía una estructura existente con tabs.

Quería que la pestaña # 3 entrara en un controller Safari dentro de la pestaña después de presionar un button en la vista existente, y no mostrar el controller Safari en su propia window como lo hace con el código pnetworkingeterminado de Apple.

La key era intercambiar un SFSafariViewController en la matriz de controlleres de vista existente de UITabBarController . Guardé el controller de vista original existente en la pestaña # 3 (índice 2) para volver a él cuando se presionó el button Hecho en el controller Safari.

Esto es lo que hice para ingresar al controller Safari desde mi pestaña cuando se presionó un button:

 NSMutableArray *viewArray = [NSMutableArray arrayWithArray:self.tabBarController.viewControllers]; self.savedController = [viewArray objectAtIndex:2]; [viewArray replaceObjectAtIndex:2 withObject:safariController]; self.tabBarController.viewControllers = viewArray; [self setTabIconTitle]; 

Entonces podría volver a la vista original en esa pestaña como esta cuando se presionó el button Hecho en el controller de Safari utilizando esta llamada de delegado:

 - (void)safariViewControllerDidFinish:(SFSafariViewController *)controller { UITabBarController *tabBarController = (UITabBarController *)self.window.rootViewController; NSMutableArray *viewArray = [NSMutableArray arrayWithArray:tabBarController.viewControllers]; [viewArray replaceObjectAtIndex:2 withObject:self.savedController]; tabBarController.viewControllers = viewArray; [self setTabIconTitle]; } 

Cuando cambié los controlleres en una salida de la matriz de controller de vista de tabBarController , perdí el icono de mi pestaña y el nombre de la pestaña, así que tuve que configurarlos. Aquí es cómo solucioné ese problema (y guardé mi tema cuando se tocó el ícono de la pestaña):

 - (void)setTabIconTitle { UITabBarController *tabBarController = (UITabBarController *)self.window.rootViewController; UITabBar *tabBar = tabBarController.tabBar; UITabBarItem *marketplaceTab = [tabBar.items objectAtIndex:2]; marketplaceTab.image = [[UIImage imageNamed:@"tab2-icon"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]; marketplaceTab.selectedImage = [UIImage imageNamed:@"tab2-icon"]; marketplaceTab.title = @"My Tab"; } 

Debo admitir que no estoy seguro de que Apple SFSafariViewController que el SFSafariViewController se use de esta manera dentro de una pestaña, de acuerdo con lo que SFSafariViewController actualmente el comportamiento normal de llamar a SFSafariViewController . Solo tenga en count que futuras actualizaciones de iOS pueden cambiar este comportamiento y siempre probar su código cuando las nuevas versiones de iOS entran en Beta.