10

我想SFSafariViewController在选项卡内加载,因此选项卡栏位于整个 Safari 视图的底部。

这可能吗?我试过这个没有运气:

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

Safari 视图是否需要全屏显示?

4

2 回答 2

4

我能够以编程方式实现这一目标。他们没有在UITabBar您的顶部覆盖的关键UIViewController是设置translucentNO

在您的 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;
}
于 2016-05-11T13:23:00.717 回答
1

使用 JAL 的答案作为基础,我能够自己在一个已经具有带有标签的现有结构的应用程序中实现这一点。

在现有视图上按下按钮后,我希望选项卡 #3 进入选项卡内的 Safari 控制器,而不是像使用 Apple 的默认代码那样将 Safari 控制器弹出到它自己的窗口中。

关键是将 a 换SFSafariViewController入现有UITabBarController的视图控制器数组。我将现有的原始视图控制器保存在标签 #3(索引 2)上,以便在 Safari 控制器上按下“完成”按钮时返回到它。

以下是我在按下按钮时使用选项卡进入 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 版时测试您的代码。

于 2016-05-16T20:12:20.810 回答