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

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

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

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

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

Q&A

解決済

1回答

1366閲覧

ImagePickerを利用中のViewの操作方法について

Ka_ya_

総合スコア31

iOS

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

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

0グッド

0クリップ

投稿2020/05/14 04:41

編集2020/05/14 08:24

質問失礼します。

撮影した画像情報を元にAPI検索を行う画面を作成中なのですが、
カメラで撮影した写真を処理してpicker.dismissをした後にAPIから情報を取得するまで少し時間が掛かる為、
dismissで戻った画面にロード中のアニメーションを実装出来ないかと思い下記の様なコードを記載したのですが、
ロード中のアニメーションが表示されませんでした。

また、画面遷移をする際もSegueを利用した遷移遷移が出来ず、
ナビゲーションバーが途切れてしまい戻るボタンなどの表示が出来ておりません。

pickerの処理は通常のviewとは別扱いで仕様なのかなとも思うのですが、
picker.dismissの後にロードアニメーションやナビゲーションバーを表示する方法はあるでしょうか。

どなたかご教授いただけますと嬉しいです。
よろしくお願い致します。

Swift

1 let activityIndicator: UIActivityIndicatorView! 2 3 override func viewDidLoad() { 4 super.viewDidLoad() 5 6 // ActivityIndicatorを作成&中央に配置 7 activityIndicator = UIActivityIndicatorView() 8 activityIndicator.frame = CGRect(x: 0, y: 0, width: 50, height: 50) 9 activityIndicator.center = self.view.center 10 11 //Viewに追加 12 self.view.addSubview(activityIndicator) 13 } 14 15//写真を撮影した後 16 func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { 17 18 if let pickedImage = info[.editedImage] as? UIImage { 19 20 //イメージをbase64にエンコードする 21 let imageData = pickedImage.pngData()! as NSData 22 let imageString = imageData.base64EncodedString(options: .lineLength64Characters) 23 //ピッカーを閉じる 24 picker.dismiss(animated: true, completion: nil) 25 26 *ロード中のアニメーションを開始したい* 27 activityIndicator.startAnimating() 28 29 //データをAPIから取得するメソッドを実行 30 var dataList = Util.returnData(image:imageString, completion: { 31           //結果を取得する 32 result in 33 34 *アニメーションを停止したい* 35 activityIndicator.stopAnimating() 36 37      *ストーリーボードIDを使用せずにナビゲーションバーを活かしたまま画面遷移したい* 38 let listVC = self.storyboard?.instantiateViewController(withIdentifier: "list") as! ListViewController 39 self.present(listVC, animated: true, completion: nil) 40 }) 41}

*追記*
コメントで記載していたactivityIndicatorが大きく表示されない件ですが、
私のコードミスが原因だったので改めて試したところ無事成功しました。
なのでactivityIndicatorの設定をこちらに記載しておきます。

Swift

1 var activityIndicator: UIActivityIndicatorView! 2 3 override func viewDidLoad() { 4 super.viewDidLoad() 5 6 // ActivityIndicatorを作成&中央に配置 7 activityIndicator = UIActivityIndicatorView() 8 //ここで指定するサイズはバックグラウンドのサイズ 9 activityIndicator.frame = CGRect(x: 0, y: 0, width: 80, height: 80) 10 activityIndicator.center = self.view.center 11 //デフォルトよりも大きいサイズのActivityIndicatorを表示する 12 activityIndicator.style = .large 13 //デザインの設定を行う 14 activityIndicator.backgroundColor = .white 15 activityIndicator.color = .gray 16 activityIndicator.layer.cornerRadius = 10 17 activityIndicator.alpha = 0.7 18 19 //アニメーションがストップしたら非表示にする 20 activityIndicator.hidesWhenStopped = true 21 22 //Viewに追加 23 self.view.addSubview(activityIndicator) 24 25 } 26コード

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

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

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

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

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

guest

回答1

0

ベストアンサー

presentは指定したViewControllerをモーダル表示するときに使うメソッドです。

NavigationControllerを使うのであれば、次のような感じで指定したViewControllerをスタックに積ませる必要があります。

swift

1 self.navigationController?.pushViewController(listVC, animated: true)

activityIndicatiorですが、まずはシンプルなコードを書いてみて機能を確かめてみられるのはいかがでしょうか。
質問者さんと同一の環境を再現することはできませんが、たとえば次のような疑似コードだときちんと表示されていました。

swift

1import UIKit 2 3class ViewController: UIViewController { 4 // let だとエラーになる 5 var activityIndicator: UIActivityIndicatorView! 6 7 override func viewDidLoad() { 8 super.viewDidLoad() 9 10 // ActivityIndicatorを作成&中央に配置 11 activityIndicator = UIActivityIndicatorView() 12 activityIndicator.frame = CGRect(x: 0, y: 0, width: 50, height: 50) 13 activityIndicator.center = self.view.center 14 15 //Viewに追加 16 self.view.addSubview(activityIndicator) 17 } 18 19 @IBAction func button(_ sender: Any) { 20 activityIndicator.startAnimating() 21 22 // 非同期処理が呼ばれたつもり 23 // 2秒後にクロージャの中身が実行される 24 DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) { 25 self.activityIndicator.stopAnimating() 26 27 let listVC = self.storyboard?.instantiateViewController(withIdentifier: "list") as! ListViewController 28 self.navigationController?.pushViewController(listVC, animated: true) 29 } 30 } 31} 32 33class ListViewController: UIViewController { 34 override func viewDidLoad() { 35 super.viewDidLoad() 36 } 37}

投稿2020/05/14 05:46

TsukubaDepot

総合スコア5086

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

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

Ka_ya_

2020/05/14 06:41

TsukubaDepotさん、丁寧なご回答ありがとうございます。 教えていただいた通りにNavigationControllerの記載を下記の様に修正してみたのですが、 画面遷移をしないけれどエラーは何も出ないという状態になりました。 その他ストーリーボードでの設定などが必要になりますでしょうか。 let listVC = self.storyboard?.instantiateViewController(withIdentifier: "list") as! ListViewController self.navigationController?.pushViewController(listVC, animated: true) activityIndicatiorに関しても丁寧にご説明下さりありがとうございます。 DispatchQueueの使い方などもとても勉強になりました! お陰様でactivityIndicatiorを表示させる事ができたのですが、 frameでサイズを変更しても表示が変わりませんでした。 調べてみるとサイズは固定のようで activityIndicator.style = .largeを使用すればサイズが大きくなると見かけたのですが、 こちらのコードをaddSubviewの前に追記しても表示は変わりませんでした。 サイズ変更はやはり難しいのでしょうか。 いつも色々と聞いてしまいすみません。 よろしければご回答よろしくお願い致します。
TsukubaDepot

2020/05/14 06:49

> 教えていただいた通りにNavigationControllerの記載を下記の様に修正してみたのですが、 > 画面遷移をしないけれどエラーは何も出ないという状態になりました。 > その他ストーリーボードでの設定などが必要になりますでしょうか。 「ナビゲーションバーが途切れてしまい」と言うことでしたので、navigationController をお使いという仮定でお話を進めましたが、こちらは実際にご利用でしょうか。そうであれば、このコードでうまくゆくかと思います。 実行されないとすれば、storyboard か navigationController が nil になっている可能性があります。 たとえば、pushViewController() の次の行に print(self.storyboard) print(self.navigationController) のような感じで各プロパティの値を表示させた場合、どのような結果になりますでしょうか。
Ka_ya_

2020/05/14 07:09

TsukubaDepotさん、ご確認いただきありがとうございます。 おっしゃる通りナビゲーションバーを次画面に表示させて画面遷移をするというのが実現したい事でした。 教えていただいた内容を記載してみたところ、 navigationControllerがnilでコンソールに表示されました。 navigationControllerがおかしいと思い改めて構成を見直したところ、 現状ではnavigationControllerの先頭にログイン画面があり、 ログインをするとトップ画面へ遷移するようにしています。 ただし一度ログインをしていたらログイン画面を表示せずにトップ画面から開始するように AppDelegateのdidFinishLaunchingWithOptionsで下記のようなコードを記載しているのですが、 これがnavigationControllerがつながらない原因でしょうか。 たびたびお手数をおかけしますが、ご確認よろしくお願い致します。 //同端末でログイン済みの場合 if UserDefaults.standard.bool(forKey: "login") == true { //ログイン画面を飛ばしてTOP画面へ遷移する if let window = self.window, let storyboard = window.rootViewController?.storyboard { window.rootViewController = storyboard.instantiateViewController(withIdentifier: "top") window.makeKeyAndVisible() }
TsukubaDepot

2020/05/14 07:14

私自身、そこまでいじったことはないのですが、コードを拝見する限り rootViewController が viewController になってしまっているのが原因のような気もします。 もちろん、top で指定した ViewController が navigationController の管理下であれば問題ないとおもいます。 ただ、これはあくまでも推測ですし、私も確実なお答えはできませんので、これはこれで新しい質問を立ち上げていただいた方が確実かもしれません。
TsukubaDepot

2020/05/14 07:16

> activityIndicator.style = .largeを使用すればサイズが大きくなると見かけたのですが、 こちらについても、別途質問を立ち上げていただいた方がいいかもしれません。 navigationController だけの問題、activityIndicator だけの問題と、ここに問題を切り分け、簡単なサンプルで動くことを確認してから、両方を合わせてみると確実かもしれません。
Ka_ya_

2020/05/14 08:04

TsukubaDepotさん、たびたびすみません。 ご回答ありがとうございます。 アプリを一度削除してログイン画面から開始したところ、 教えていただいたコードでナビゲーションバーを表示させたまま画面表示する事が出来ました! こちらで質問させていただいた本題はお陰様で解決しましたので、 おっしゃる通りそれらの問題は別途質問させていただこうと思います。 何度もお手数をおかけしてすみません、ありがとうございました^^
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問