Menu

Category

Archive

logo


UIScrollViewの中に複数のViewControllerのViewを表示する

2014-10-03 09:00:00 +0900
  • このエントリーをはてなブックマークに追加

横にスワイプして、ScrollViewをページのようにいくつかのStroboardから初期化されたViewControllerのViewを表示する方法。SnapChatのようなUIです。無駄にハマってしまいました。

メインViewController

まずは、UIScrollViewを持つViewController。ここでハマりました。

 1 class MeemoListViewController: UIViewController {
 2 
 3     @IBOutlet weak var scrollView: UIScrollView!
 4     
 5     var controllers : NSMutableArray! // 必須
 6     
 7     override func viewDidLoad() {
 8         super.viewDidLoad()
 9         
10         // Set up scroll view
11         buildScrollView()
12     }
13 
14     func buildScrollView() {
15     
16      self.controllers = NSMutableArray(capacity: 0)
17      
18      let size = CGSizeMake(UIScreen.mainScreen().applicationFrame.size.width, UIScreen.mainScreen().applicationFrame.size.height)
19              self.scrollView.setTranslatesAutoresizingMaskIntoConstraints(false)
20      
21      // Add Setting Page
22      let storyBordStt = UIStoryboard(name: "SettingViewController", bundle: nil)
23      var settingController : SettingViewController = storyBordStt.instantiateInitialViewController() as SettingViewController
24      var settingView = settingController.view
25      self.scrollView.addSubview(settingView)
26      self.controllers.addObject(settingController) // 保持!
27      
28      // Add Main Page
29      let stroBoardMain = UIStoryboard(name: "MemoListViewController", bundle: nil)
30      var mainController : MemoListViewController = stroBoardMain.instantiateInitialViewController() as MemoListViewController
31      var mainView = mainController.view
32      self.scrollView.addSubview(mainView)
33      self.controllers.addObject(mainController) // 保持!
34 
35      var currentLoc : CGFloat = 0
36      var subviews : Array = self.scrollView.subviews as Array<UIView>
37      
38      for (viewBox : UIView) in subviews {
39          if viewBox.tag == 100 {
40              var frame : CGRect = viewBox.frame
41              frame.origin = CGPointMake(currentLoc, 0);
42              viewBox.frame = frame;
43              currentLoc += (UIScreen.mainScreen().bounds.size.width)
44          }
45      }
46          
47      self.scrollView.contentSize = CGSizeMake(2 * UIScreen.mainScreen().bounds.size.width, UIScreen.mainScreen().applicationFrame.size.height)
48     }
49 }

buildScrollView()の中で、分割されたStoryBoardからそれぞれViewControllerを生成し、そのViewをScrollViewに追加しています。このUIScrollViewを持っているメインのViewControllerのポイントは、インスタンス変数としてcontrollersという配列を用意し、その中にUIScrollViewの中で使用するViewControllerを保持していることです。これがないと、UIScrollViewの中のViewControllerが恐らく解放され、不安定な挙動になります。エラーメッセージも頼りにならず、かなりハマってしまいました。

今回は、配列のインスタンス変数を用意しましたが、参考URLの2つ目の記事のように、それぞれのViewControllerのインスタンス変数を作成してもよいと思います。

参考

How do I put viewController's into a UIScrollView
iOS Swift: Swipe View