[Objective-C]UIScrollViewにUIViewControllerのViewを追加する
こんにちは、プログラマのLFです。
雪ですね。
こんな日は一刻も早く家に帰り飼い猫を膝の上で寝かしつけ、
のんびり暖をとって過ごしたいものです。
まぁうちの猫は7キロあるのですぐに足がしびれて
のんびりしてられなくなるのですが…。
さて。
今日はUIScrollViewにUIViewControllerのViewを追加する方法について書いてみたいと思います。
UIScrollViewにUITableViewを追加する方法は検索によくヒットするのですが
UIViewControllerのViewを追加する方法については
うまくヒットしなかったので、同じことで悩んでいる方の参考になればいいな、と。
まずソースコードから。
ViewController.m
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
- (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [self setViewControllerToScrollView]; } -(void)setViewControllerToScrollView { UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]]; UIViewController *initialViewController; int numberOfPages = 10; for (int i = 0; i < numberOfPages; i++) { //---追加するViewの座標を計算 CGRect rect = self.view.bounds; CGPoint point = rect.origin; point.x = i * [Utils getScreenWidth]; rect.origin = point; //---ここまで switch (i) { case 1: initialViewController = [storyboard instantiateViewControllerWithIdentifier:@"hoge"]; break; case 2: initialViewController = [storyboard instantiateViewControllerWithIdentifier:@"hogehoge"]; break; default: initialViewController = [storyboard instantiateViewControllerWithIdentifier:@"hogehogehoge"]; break; } [self addChildViewController:initialViewController]; //子のViweControllerとして追加 [initialViewController didMoveToParentViewController:self]; //追加が終わったことを明示的に宣言する必要がある UIView *vcView = initialViewController.view; vcView.frame = rect; //各ビューのframeにrectをセット [_scrollView addSubview:vcView]; } storyboard = nil; //初期化しておく initialViewController = nil; //初期化しておく } |
想定として
・Main.storyboardにViewControllerクラスを適用したSceneが配置されていて
そこにUIScrollViewが配置され、IBOutletでscrollViewという変数名で紐付けされている
・Main.storyboardにIdentifierがhoge、hogehoge、hogehogehogeというSceneが配置されていて
UIViewControllerのサブクラスが適用されている
状態です。
[self addChildViewController:initialViewController]
をしている理由ですが、
viewをsddSubViewしただけではScene上にUITableViewが配置されているときに
スクロールがされないという現象がありまして、
上記の一行を追加しました。
またUIScrollViewとUITableViewが入れ子になっている場合は
UIScrollViewのサブクラスを作成して
hitTestメソッドを上書きしてあげないと
子のUITableViewが操作できないようです。
CustomScrollView.m(UIScrollViewのサブクラスの実装ファイル)
1 2 3 4 |
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { UIView *hitView = [super hitTest:point withEvent:event]; return hitView; } |
ひとまずこの方法でUIScrollViewにUIViewControllerのViewを追加することができました。
参考になればうれしいです。