横にスワイプして、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