我想在标签内加载SFSafariViewController
,因此标签栏位于整个Safari视图的底部。
这可能吗?我试了这个没有运气:
[self.tabBarController presentViewController:sfController animated:YES completion:nil];
是必需 Safari视图是全屏吗?
答案 0 :(得分:3)
我能够以编程方式实现此目的。他们关键是在UITabBar
之上没有UIViewController
叠加层,将translucent
设置为NO
:
在你的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;
}
答案 1 :(得分:1)
使用JAL的答案作为基础,我能够在一个已经具有选项卡的现有结构的应用程序中实现这一点。
我想让标签#3在现有视图上按下按钮后进入选项卡中的Safari控制器,而不是像使用Apple的默认代码那样将Safari控制器弹出到自己的窗口中。 / p>
关键是将SFSafariViewController
换成现有的UITabBarController
视图控制器数组。当我在Safari控制器上按下完成按钮时,我将选项卡#3(索引2)上的现有原始视图控制器保存回来。
这是我在按下按钮时使用我的标签进入Safari控制器所做的工作:
NSMutableArray *viewArray = [NSMutableArray arrayWithArray:self.tabBarController.viewControllers];
self.savedController = [viewArray objectAtIndex:2];
[viewArray replaceObjectAtIndex:2 withObject:safariController];
self.tabBarController.viewControllers = viewArray;
[self setTabIconTitle];
然后,当使用此委托调用在Safari控制器上按下完成按钮时,我可以像这样切换回该选项卡上的原始视图:
- (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];
}
当我在tabBarController
视图控制器阵列中交换控制器时,我丢失了选项卡图标和选项卡名称,因此我必须设置它们。以下是我修复该问题的方法(并在触摸标签图标时保留了主题):
- (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";
}
我必须承认,我不确定Apple是否打算在标签中以这种方式使用SFSafariViewController
,这取决于调用SFSafariViewController
当前的正常行为。请注意,未来的iOS更新可能会改变此行为,并在新的iOS版本进入Beta版时始终测试您的代码。