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

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

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

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

Swift

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

Q&A

解決済

1回答

252閲覧

ボタンを押すとすぐにインジゲーターが出るようにし、その間に別の処理を行いたい。

mimamo

総合スコア44

Xcode

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

Swift

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

0グッド

0クリップ

投稿2019/02/14 11:02

編集2019/02/15 08:43

前提・実現したいこと

Navigationbarの右側に配置したボタンを押すことでPDFを作成できるようにしているのですが、その処理が重いためかボタンを押すとしばらく動かせなくなります。

そこでインジゲーターを表示させるようにしたいのですが、そのようにコーディングしてもPDF作成の処理が先に施され、インジゲーターの表示が後になってしまいます。

ボタンはstoryboardで以下のように配置しています。
イメージ説明
ボタンを押すとインジゲーター表示、PDF作成、画面遷移を行いたいと思っています。

ボタンをひとつにするとインジゲーターは表示されるようになったのですが、PDF作成や画面遷移をしなくなりました。

Navigationbarのところに配置したボタンがゆえに処理が上手くいってないのかなと思うのですが、、、ご教授よろしくお願いいたします。

該当のソースコード

インジゲーター表示させっぱなしのコード

swift

1class ViewController2: UIViewController, UIGestureRecognizerDelegate,UIImagePickerControllerDelegate,UINavigationControllerDelegate { 2 var ActivityIndicator: UIActivityIndicatorView! 3 override func viewDidLoad() { 4 super.viewDidLoad() 5 6 7 // ActivityIndicatorを作成&中央に配置 8 ActivityIndicator = UIActivityIndicatorView() 9 ActivityIndicator.frame = CGRect(x: 0, y: 0, width: 50, height: 50) 10 ActivityIndicator.center = self.view.center 11 12 // クルクルをストップした時に非表示する 13 ActivityIndicator.hidesWhenStopped = true 14 15 // 色を設定 16 ActivityIndicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyle.gray 17 18 //Viewに追加 19 self.view.addSubview(ActivityIndicator) 20 21 } 22 23 @IBAction func push(_ sender: Any) { 24 print("push") 25 26 // クルクルスタート 27 ActivityIndicator.startAnimating() 28 29 30 31 let x = self.getimage.frame.origin.x 32 let y = self.getimage.frame.origin.y 33 UserDefaults.standard.set(y, forKey: "uekaranokyori") 34 let imageHeight = self.screenWidth * 210.0 / 143.5 35 36 37 ///////////////////////////////////////////////////////////VIEWのため変更 38 39 40 41 //VIEW.frame = pdfImageView.bounds 42 43 let pdfData = NSMutableData() 44 45 //binsenの画像 46 let binhoge = UserDefaults.standard.integer(forKey: "selectedTag") 47 let bin: UIImage = UIImage(named:"binsen(binhoge)-1.jpg")! 48 //元画像の大きさのUIImageViewを作る 49 let pdfImageView = UIImageView(image: bin) 50 51 52 //どんな大きさ、位置のものを表示するのか 53 //UIGraphicsBeginImageContextWithOptions(getimage.frame.size, false, 0.0) 54 let gamen:CGRect = CGRect(x: 0, y: 0, width: self.screenWidth, height: imageHeight) 55 UIGraphicsBeginPDFContextToData(pdfData, pdfImageView.bounds, nil) 56 print("gamen = (gamen)") 57 ////////CGRect(x: 0, y: 0, width: screenWidth, height: imageHeight) 58 59 //print("pdfContex1 = (pdfContext1)") 60 UIGraphicsBeginPDFPage() 61 62//サイズをbinの元々のサイズにする 63 let pdfContext1 = UIGraphicsGetCurrentContext() //// 64 pdfContext1?.scaleBy(x: pdfImageView.bounds.width/self.self.screenWidth, y: pdfImageView.bounds.height/imageHeight)//// 65 UserDefaults.standard.set(pdfImageView.bounds.width/self.screenWidth, forKey: "X") 66 UserDefaults.standard.set(pdfImageView.bounds.height/imageHeight, forKey: "Y") 67 print("X=(pdfImageView.bounds.width)") 68 print("Y=(pdfImageView.bounds.height)") 69 70 guard let pdfContext = UIGraphicsGetCurrentContext() else { return } 71 //VIEW.layer.render(in: pdfContext) 72 73 bin.draw(in: gamen) 74 self.draw(imageView: self.getphoto) 75 76 //image?.draw(in: CGRect(x:,y:,width:,height:)) 77 //CGRect(x: 0, y: 0, width: pdfImageView.bounds.width, height: pdfImageView.bounds.height) 78 79 80 81 UIGraphicsEndPDFContext() 82 83 84 85 if let documentDirectories = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first { 86 let documentsFileName = documentDirectories + "/test.pdf" 87 //パスを保存して次の画面で表示させる 88 UserDefaults.standard.set(documentsFileName, forKey:"filePath") 89 debugPrint(documentsFileName) 90 pdfData.write(toFile: documentsFileName, atomically: true) 91 print("確認") 92 } 93 94 95 96 97 98 99 100 101 102 //let getimagerectback:CGRect = CGRect(x:x, y:y, width:screenWidth, height:imageHeight) 103 //getimage.frame = getimagerectback; 104 105 ///////////////////////////////////////////////////////////VIEWのため変更 106 //VIEW.frame = imagerect; 107 108 } 109 110 /// カレントコンテキストに対してUIImageViewが持つimageをUIImageViewの姿勢のまま描画します。 111 private func draw(imageView: UIImageView) { 112 guard let image = imageView.image else { return } 113 guard let ctx = UIGraphicsGetCurrentContext() else { return } 114 let orgTransform = imageView.transform 115 imageView.transform = .identity 116 let orgFrame = imageView.frame 117 imageView.transform = orgTransform 118 119 ctx.saveGState() 120 ctx.translateBy(x: +orgFrame.midX, y: +orgFrame.midY) 121 ctx.concatenate(orgTransform) 122 ctx.translateBy(x: -orgFrame.midX, y: -orgFrame.midY) 123 124//binsenの画像 125 let binhoge = UserDefaults.standard.integer(forKey: "selectedTag") 126 let bin: UIImage = UIImage(named:"binsen(binhoge)-1.jpg")! 127//元画像の大きさのUIImageViewを作る 128 let pdfImageView = UIImageView(image: bin) 129 screenWidth = self.view.bounds.width 130let imageHeight = screenWidth * 210.0 / 143.5 131 132 133 image.draw(in: orgFrame.aspectFit(contentSize: image.size, stretchble: true, integer: false)) 134 //image.size 135 136 ctx.restoreGState() 137 } 138

補足情報(FW/ツールのバージョンなど)

Swiftのversionは4.1.2
Xcodeのversionは9.4.1

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

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

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

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

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

guest

回答1

0

ベストアンサー

PDF作成処理をメインスレッドで行っているので、その間UIは更新されません。
PDF作成処理を別スレッドで行って下さい。

「ボタンをひとつにすると〜」以降は意味(状況)がいまいち分かりません。急に遷移の話が出てきて???です。

投稿2019/02/15 00:16

fuzzball

総合スコア16731

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

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

mimamo

2019/02/15 09:16

ご回答ありがとうございます。 説明不足ですみません、ボタンを押すとインジゲーター表示、PDF作成、画面遷移を行いたいと思っています。 別のスレッドで処理する方法を調べてコーディングしてみました。 質問本文に載せた、ボタンを押すとされる処理をpdsSakuseiという関数にしました。 そして @IBAction func push(_ sender: Any) { // クルクルスタート ActivityIndicator.startAnimating() // キューを生成してサブスレッドで実行 DispatchQueue(label: "jp.classmethod.app.queue").async { self.pdfSakusei() } } としました。 次の画面で作成したPDFを表示するようになっているのですが、ボタンを1回押すと空のPDFが作成され、ボタンを2回押すと1回目で作成されるはずのPDFが作成されました。 インジゲーターも表示されないので、このコードだと別スレッドで処理することになっていないみたいなのですが、他にどのようにコーディングすべきがわからず手が止まってしました、、ご教授よろしくお願いします。
fuzzball

2019/02/15 09:27

一気に全部解決しようとするのではなく、一つ一つ解決していってはどうでしょうか? ・インジケータの表示 ・別スレッドで実行 ・PDF作成(これは出来てるんですよね) 今のプロジェクトでやるのではなく、一つ一つ別プロジェクトを作って検証しましょう。 現状、何が問題になっているのか、切り分けができていないと思います。 例えば、今までにインジケータを一度でも表示させたことはあるのでしょうか? 無いのであれば、ボタンでON/OFFするようなものを作ってみて下さい。
fuzzball

2019/02/15 09:39

あー、インジケータは表示したことあるって書いてましたね。失礼。 ということは「別スレッドで実行」ですね。 何か調べるときは一つの記事ではなく、複数の記事を参照して下さい。(なるべく新しいの) あと、self.pdfSakusei() で試すのではなく、例えば、 print("start") Thread.sleep(forTimeInterval: 5) //5秒間停止 print("finish") のような疑似処理で作るのがいいと思います。 (これで5秒間クルクルが表示されれば成功)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問