Menu

Category

Archive

logo


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

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

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

メインViewController

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

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
38
39
40
41
42
43
44
45
46
47
48
49
class MeemoListViewController: UIViewController {

    @IBOutlet weak var scrollView: UIScrollView!
    
    var controllers : NSMutableArray! // 必須
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // Set up scroll view
        buildScrollView()
    }

    func buildScrollView() {
    
	    self.controllers = NSMutableArray(capacity: 0)
	    
	    let size = CGSizeMake(UIScreen.mainScreen().applicationFrame.size.width, UIScreen.mainScreen().applicationFrame.size.height)
	            self.scrollView.setTranslatesAutoresizingMaskIntoConstraints(false)
	    
	    // Add Setting Page
	    let storyBordStt = UIStoryboard(name: "SettingViewController", bundle: nil)
	    var settingController : SettingViewController = storyBordStt.instantiateInitialViewController() as SettingViewController
	    var settingView = settingController.view
	    self.scrollView.addSubview(settingView)
	    self.controllers.addObject(settingController) // 保持!
	    
	    // Add Main Page
	    let stroBoardMain = UIStoryboard(name: "MemoListViewController", bundle: nil)
	    var mainController : MemoListViewController = stroBoardMain.instantiateInitialViewController() as MemoListViewController
	    var mainView = mainController.view
	    self.scrollView.addSubview(mainView)
	    self.controllers.addObject(mainController) // 保持!

	    var currentLoc : CGFloat = 0
	    var subviews : Array = self.scrollView.subviews as Array<UIView>
	    
	    for (viewBox : UIView) in subviews {
	        if viewBox.tag == 100 {
	            var frame : CGRect = viewBox.frame
	            frame.origin = CGPointMake(currentLoc, 0);
	            viewBox.frame = frame;
	            currentLoc += (UIScreen.mainScreen().bounds.size.width)
	        }
	    }
	        
	    self.scrollView.contentSize = CGSizeMake(2 * UIScreen.mainScreen().bounds.size.width, UIScreen.mainScreen().applicationFrame.size.height)
    }
}

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