質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

Q&A

1回答

2666閲覧

[Swift]画面遷移について

erktks

総合スコア13

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

0グッド

2クリップ

投稿2016/02/22 12:43

カレンダーアプリを作成しています。
親画面(ViewContoroller)をタップすると、編集用となる子画面を前面に表示するような実装を行いたいと考えています。
ただし、親画面より子画面のサイズは小さいサイズで、子画面を表示中も後ろで親画面が少し見えているようなイメージで、
あと、子画面にはテーブルビューも表示させる予定です。

そこで質問ですが、上記のような実装を行なう場合、子画面はTableViewContorollerを使用すべきでしょうか。また、TableViewContorollerを使用した場合、親画面(ViewController)よりサイズを小さくして表示したりする事はできるのですか。

どういった実装方法があるかご教授くださいませ。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

Storyboard上で作るならUITableViewController単体のサイズ変更はできないのでContainerViewで孫のViewControllerとして分けてやるか、子のUIViewControllerにUITableViewを小さく張り付けDelegate, DataSourceを自前で接続するかになると思います。
それを親のViewControllerにaddChildViewController/addSubViewで一時的に追加するか、ウィンドウをもう一個作ってやってポップアップ的に出すかのどちらかになるかと。

投稿2016/02/22 17:05

toki_td

総合スコア2850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

erktks

2016/02/23 15:34

ご回答いただき、誠にありがとうございます。 >>ContainerViewで孫のViewControllerとして分けてやる >>それを親のViewControllerにaddChildViewController/addSubViewで一時的に追加 のお言葉を参考に、色々調べながらサンプルつくってみました。動きは問題なさそうですが、ここはこの方が良いとかあればご指摘頂けると幸いです。 あと、子ビューを開く/閉じるときにアニメーションをつけたいのですが、可能でしょうか。 親:ViewController、子:ChildViewController、孫:TableViewController ------------------------------------------------------------------------------------------------ class ViewController: UIViewController { var baseView:UIView! var button1:UIButton! //ボタン1 var childViewController: UIViewController! override func viewDidLoad() { var x:CGFloat var y:CGFloat var width:CGFloat var height:CGFloat super.viewDidLoad() //表示ビュー width = UIScreen.mainScreen().bounds.size.width height = UIScreen.mainScreen().bounds.size.height x = 0 y = 0 baseView = UIView(frame: CGRectMake(x, y,width, height)); baseView.backgroundColor = UIColor(red: 255/255.0, green: 0/255.0, blue: 0/255.0, alpha: 1) self.view.addSubview(baseView) //ボタン1 width = UIScreen.mainScreen().bounds.size.width height = UIScreen.mainScreen().bounds.size.height * 0.1 x = 0 y = UIScreen.mainScreen().bounds.size.height - height button1 = UIButton(frame: CGRectMake(x,y,width,height)) button1.setTitle("開く", forState:UIControlState.Normal) button1.backgroundColor = UIColor(red: 100/255.0, green: 100/255.0, blue: 100/255.0, alpha: 1) button1.addTarget(self, action: "onClickButton1:", forControlEvents:.TouchUpInside) self.baseView.addSubview(button1) //子ビューコントローラー childViewController = ChildViewController() childViewController.view.frame = baseView.bounds } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } internal func onClickButton1(sender: UIButton){ self.addChildViewController(childViewController) self.baseView.addSubview(childViewController.view) childViewController.didMoveToParentViewController(self) //self.presentViewController(childViewController, animated: true, completion: nil) } } class ChildViewController: UIViewController { var baseView:UIView! var button2:UIButton! //ボタン2 override func viewDidLoad() { var x:CGFloat var y:CGFloat var width:CGFloat var height:CGFloat super.viewDidLoad() //透過 self.view.backgroundColor = UIColor(red: 0/255.0, green: 0/255.0, blue: 0/255.0, alpha: 0.5) //表示ビュー width = self.view.bounds.size.width*0.8 height = self.view.bounds.size.height*0.7 x = (self.view.bounds.size.width-width)/2 y = (self.view.bounds.size.height-height)/2 self.baseView = UIView(frame: CGRectMake(x,y,width,height)); self.baseView.backgroundColor = UIColor(red: 0/255.0, green: 0/255.0, blue: 255/255.0, alpha: 1) self.view.addSubview(baseView) //ボタン2 width = self.baseView.bounds.size.width height = self.baseView.bounds.size.height * 0.1 x = 0 y = self.baseView.bounds.size.height - height button2 = UIButton(frame: CGRectMake(x,y,width,height)) button2.setTitle("閉じる", forState:UIControlState.Normal) button2.backgroundColor = UIColor(red: 100/255.0, green: 100/255.0, blue: 100/255.0, alpha: 1) button2.addTarget(self, action: "onClickButton2:", forControlEvents:.TouchUpInside) self.baseView.addSubview(button2) //テーブルビュー width = self.baseView.bounds.size.width*0.8 height = self.baseView.bounds.size.height*0.7 x = (self.baseView.bounds.size.width - width) / 2 y = (self.baseView.bounds.size.height - height) / 2 var tableViewController:TableViewController = TableViewController() tableViewController.view.frame = CGRectMake(x,y,width,height) //tableViewController.view.frame = self.baseView.bounds self.addChildViewController(tableViewController) self.baseView.addSubview(tableViewController.view) tableViewController.didMoveToParentViewController(self) } internal func onClickButton2(sender: UIButton){ self.willMoveToParentViewController(nil) self.view.removeFromSuperview() self.removeFromParentViewController() } //willMoveToParentViewController(){ //} }
toki_td

2016/02/24 13:28

ざっと見た感じ問題ないように思います。 アニメーションはanimateWith~で自前でしないといけないと思います。 画面ソロからスライドさせるなら 1.ビューを追加する際の初期位置を画面下とかにしておく 2. add...で追加 3. animateWith~のanimateで表示位置までアニメーション 4. completionでdidMoveToParentViewControllerを呼ぶ という感じです。 消える場合はその逆でwillMoveToParentViewControllerを読んだ後アニメーションを開始、completionでremove...を呼びます。
erktks

2016/02/27 13:11

遅くなってすみません。 コメントいただいた内容でアニメーション(拡大表示)をつけてみたのですが、 childViewControllerに乗せたボタンやテーブルビューが先に表示されてしまいます。。 アニメーションと同時に表示?させたいのですが、どうしたらよろしいでしょうか。。
toki_td

2016/03/02 04:45

先に表示される、というのがいまいち状況がわからないのですが… 何かはアニメーションできているということでしょうか?背景だけとか? アニメーションはanimateWith~を呼び出した時点の各種値(frameやalphaなど)からanimate内で指定した値までの連続的な変化をiOSが肩代わりしているだけです。 ですので、変化がなければそのままの表示になりますし、親子関係はアニメーション中でも同じでアニメーションの対象になっているビューのframeが変化すれば子も画面上の位置は移動します(親からの相対位置はそのままです) ボタンやテーブルビューをまとめて移動させたい場合、その親となるbaseViewに対してアニメーションを指定するか個別に同じオフセット量移動させる必要があります。 ちなみに、拡大表示というのは画面の中央からフワッと現れるような感じでしょうか? その場合はbaseViewに対してalphaとtransformでアニメーションするのがいいと思います。
erktks

2016/03/03 12:26

ご回答ありがとうございます。 >ちなみに、拡大表示というのは画面の中央からフワッと現れるような感じでしょうか? >その場合はbaseViewに対してalphaとtransformでアニメーションするのがいいと思います →頂いたアドバイスどおりやってみたらうまくいきました! ただ、閉じるときに、縮小アニメーションがうまくされず、すぐにbaseViewが非表示になってしまいます。。 作成したプログラムを載せさせていただきます。 -------------------------------------------------------------------------------------------------------------- class ViewController: UIViewController { var baseView:UIView! var button1:UIButton! //ボタン1 var childViewController: UIViewController! override func viewDidLoad() { var x:CGFloat var y:CGFloat var width:CGFloat var height:CGFloat super.viewDidLoad() //表示ビュー width = UIScreen.mainScreen().bounds.size.width height = UIScreen.mainScreen().bounds.size.height x = 0 y = 0 baseView = UIView(frame: CGRectMake(x, y,width, height)); baseView.backgroundColor = UIColor(red: 255/255.0, green: 0/255.0, blue: 0/255.0, alpha: 1) self.view.addSubview(baseView) //ボタン1 width = UIScreen.mainScreen().bounds.size.width height = UIScreen.mainScreen().bounds.size.height * 0.1 x = 0 y = UIScreen.mainScreen().bounds.size.height - height button1 = UIButton(frame: CGRectMake(x,y,width,height)) button1.setTitle("開く", forState:UIControlState.Normal) button1.backgroundColor = UIColor(red: 100/255.0, green: 100/255.0, blue: 100/255.0, alpha: 1) button1.addTarget(self, action: "onClickButton1:", forControlEvents:.TouchUpInside) self.baseView.addSubview(button1) } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } internal func onClickButton1(sender: UIButton){ //子ビューコントローラー childViewController = ChildViewController() self.childViewController.view.frame = self.baseView.bounds self.addChildViewController(childViewController) self.baseView.addSubview(childViewController.view) childViewController.didMoveToParentViewController(self) } } class ChildViewController: UIViewController { var baseView:UIView! var button2:UIButton! //ボタン2 override func viewDidLoad() { var x:CGFloat var y:CGFloat var width:CGFloat var height:CGFloat super.viewDidLoad() //透過 self.view.backgroundColor = UIColor(red: 0/255.0, green: 0/255.0, blue: 0/255.0, alpha: 0.5) //表示ビュー width = self.view.bounds.size.width*0.8 height = self.view.frame.size.height*0.7 x = (self.view.bounds.size.width-width)/2 y = (self.view.bounds.size.height-height)/2 self.baseView = UIView(frame: CGRectMake(x,y,width,height)); self.baseView.backgroundColor = UIColor(red: 0/255.0, green: 0/255.0, blue: 255/255.0, alpha: 1) self.baseView.alpha = 0 self.baseView.transform = CGAffineTransformMakeScale(0,0) self.view.addSubview(baseView) //テーブルビュー width = self.baseView.bounds.size.width*0.8 height = self.baseView.bounds.size.height*0.7 x = (self.baseView.bounds.size.width - width) / 2 y = (self.baseView.bounds.size.height - height) / 2 var tableViewController:TableViewController = TableViewController() tableViewController.view.frame = CGRectMake(x,y,width,height) self.addChildViewController(tableViewController) self.baseView.addSubview(tableViewController.view) tableViewController.didMoveToParentViewController(self) //ボタン2 width = self.baseView.bounds.size.width height = self.baseView.bounds.size.height * 0.1 x = 0 y = self.baseView.bounds.size.height - height button2 = UIButton(frame: CGRectMake(x,y,width,height)) button2.setTitle("閉じる", forState:UIControlState.Normal) button2.backgroundColor = UIColor(red: 100/255.0, green: 100/255.0, blue: 100/255.0, alpha: 1) button2.addTarget(self, action: "onClickButton2:", forControlEvents:.TouchUpInside) self.baseView.addSubview(button2) //アニメーション表示 UIView.animateWithDuration(0.5, animations: { self.baseView.transform = CGAffineTransformMakeScale(1,1) self.baseView.alpha = 1 }, completion: { finished in }) } internal func onClickButton2(sender: UIButton){ //アニメーション非表示 UIView.animateWithDuration(0.5, animations: { self.baseView.transform = CGAffineTransformMakeScale(0,0) self.baseView.alpha = 0 }, completion: { finished in self.willMoveToParentViewController(nil) self.view.removeFromSuperview() self.removeFromParentViewController() }) } }
toki_td

2016/03/07 14:55 編集

すみません、遅くなりました。 非表示にする際のScaleですが0,0にするとアニメーションせず即サイズが0になって消えたように見えるみたいです。僕も以前ひっかかりました。 (0.001, 0.001)とかにすると治りますよ。 ついでに、非表示の時のwillMoveTo〜はこれから消えるよ、という通知なのでanimationWith〜より先に呼んだほうが行儀がいいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問