web-dev-qa-db-ja.com

3つのViewController間をスワイプするようにUIScrollViewを設定する

3つのビューコントローラ間をスワイプできるようにUIScrollViewを設定しようとしています。これはAppDelegate.mの私のコードです:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch.;

UIScrollView *sv = [[UIScrollView alloc] init];

BarsViewController *bvc = [[BarsViewController alloc] init]; // Create BarsViewController
StopwatchViewController *svc = [[StopwatchViewController alloc] init]; // Create StopwatchViewController
TimerViewController *tvc = [[TimerViewController alloc] init]; // Create TimerViewController

[sv addSubview:bvc.view];
[sv addSubview:svc.view];
[sv addSubview:tvc.view];

[[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationFade]; // Hide status bar

self.window.rootViewController = sv;
[self.window makeKeyAndVisible];
return YES;
}

この行にエラーが表示されます。

self.window.rootViewController = sv;

「UIScrollView * 'から' UIViewController * 'に割り当てられている互換性のないポインタタイプ」と言っています。

ただし、UIScrollViewControllerのようなものはないので、どうしたらよいかわかりません。

基本的には、画面全体をスクロールビューにして、3つのビューコントローラー間をスワイプできるようにします。どうすればそれを行うことができますか?

14
user2397282

UPD:2015年6月スイフト

概念は同じままです。これについては、以下のObjective-Cセクションで説明します。構文に少し変更があります。 childviewcontrollerを追加するには、次のスニペットを使用します。

let aViewController = storyboard.instantiateViewControllerWithIdentifier("A") as! AViewController;

addChildViewController(aViewController);
scrollView!.addSubview(aViewController.view)
aViewController.didMoveToParentViewController(self)

私をチェックしてください Swift Githubサンプルコード

Objective-C

独自のカスタムコンテナビューコントローラ(これをcombinedViewControllerと呼びます)を作成します。これにより、3つのコントローラがスクロールビューで保持されます。いつものようにUIViewControllerを継承し、次のように新しいcombinedViewController -viewDidLoad:でaddChildViewControllerパブリックAPIを使用します。

[self addChildViewController:aViewController];
[self.scrollView addSubview:aViewController.view];
[aViewController didMoveToParentViewController:self];

コードの機能は次のとおりです。

  • コンテナのaddChildViewController:メソッドを呼び出して子を追加します。
  • 子のviewプロパティにアクセスしてビューを取得し、それを独自のビュー階層に追加します。コンテナは、ビューを追加する前に子供のサイズと位置を設定します。コンテナは常に、子供のコンテンツが表示される場所を選択します。
  • 子のdidMoveToParentViewController:メソッドを明示的に呼び出して、操作が完了したことを通知します。

この操作は、各viewControllerで実行します。その後、combinedViewControllerをrootViewControllerとして設定します。

さらに説明が必要な場合は、お気軽にお問い合わせください。

参照: カスタムコンテナビューコントローラの設計

これが私の Objective-C Githubサンプルコード

UPD:addChildViewController:メソッドが子のwillMoveToParentViewController:メソッドも自動的に呼び出すことを明確にしてくれた@OliverAtkinsonに感謝します。

結果:

enter image description here

39
    let obj1 = self.storyboard?.instantiateViewControllerWithIdentifier("DocumentsVC") as! DocumentsVC
    let obj2 = self.storyboard?.instantiateViewControllerWithIdentifier("AppointmentsVC") as! AppointmentsVC
    let obj3 = self.storyboard?.instantiateViewControllerWithIdentifier("DashboardVC") as! DashboardVC

    self.containerScrollView.frame = obj2.view.frame

    self.containerScrollView.addSubview(obj2.view)
    obj2.willMoveToParentViewController(self)
    self.addChildViewController(obj2)

    self.containerScrollView.addSubview(obj1.view)
    obj1.willMoveToParentViewController(self)
    self.addChildViewController(obj1)

    self.containerScrollView.addSubview(obj3.view)
    obj3.willMoveToParentViewController(self)
    self.addChildViewController(obj3)

    self.containerScrollView.contentSize = CGSizeMake(3*UIScreen.mainScreen().bounds.width, 0)

    obj1.view.frame.Origin =  CGPointMake(0, 0)
    obj2.view.frame.Origin =  CGPointMake(UIScreen.mainScreen().bounds.width, 0)
    obj3.view.frame.Origin = CGPointMake(2*UIScreen.mainScreen().bounds.width, 0)
2
sachin

Swift 3.

Sachinの回答に基づいて-もう少し一般的-ビュー配列に次の要素を追加するだけです

var views = [ViewController(), ViewController2(), ViewController3(), ViewController4()]

func setupScrollView() {
    scrollView.frame = views.first!.view.frame
    scrollView.contentSize = CGSize(width: CGFloat(views.count) * width, height: 0)
    _ = views.map({ addViewToScrollView($0) })
    _ = views.map({ $0.view.frame.Origin =  CGPoint(x: CGFloat(views.index(of: $0)!) * width, y: 0) })
}

func addViewToScrollView(_ viewController: UIViewController) {
    scrollView.addSubview(viewController.view)
    views.willMove(toParentViewController: self)
    addChildViewController(viewController)
}
2
chrisco

このgitリポジトリを試してください。このリポジトリを使用すると、Snapchat/Tinderメインページのようなビューナビゲーションを作成できます。

https://github.com/goktugyil/EZSwipeController

1
Jayesh Thanki