10

タブ内に読み込みたいSFSafariViewControllerので、タブ バーは Safari ビュー全体の下部にあります。

これは可能ですか?私は運がないのでこれを試しました:

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

Safari ビューを全画面表示にする必要はありますか?

4

2 に答える 2

4

私はこれをプログラムで達成することができました。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;
}
于 2016-05-11T13:23:00.717 に答える
1

JALの回答をベースとして使用して、すでにタブのある既存の構造を持っているアプリにこれを自分で実装することができました.

既存のビューでボタンが押された後、タブ #3 がタブ内の Safari コントローラーに入り、Apple のデフォルト コードを使用する場合のように Safari コントローラーを独自のウィンドウにポップしないようにしたかったのです。

SFSafariViewController重要なのは、 aを既存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 バージョンがベータ版になったときは常にコードをテストしてください。

于 2016-05-16T20:12:20.810 に答える