🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Swift

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

Q&A

解決済

1回答

1082閲覧

カメラで撮影した写真を保存することができ、他のボタンを押しても複製しないようにしたい

MashisonJr.

総合スコア11

Swift

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

0グッド

0クリップ

投稿2019/12/02 06:21

カメラで撮影した写真を保存できるのはいいんですけど、ライブラリから写真を選択したらその選択した画像が複製されるといういらない機能まで付いてきます。カメラで撮影した写真を保存だけをできるようにして、このいらない複製機能を消したいです。どうすればいいでしょうか?

Swift

1 2import UIKit 3 4//画像を選択 5extension TapViewController: UIImagePickerControllerDelegate, UINavigationControllerDelegate { 6 7 //画像を選んだ時の処理 8 func imagePickerController(_ picker: UIImagePickerController,didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { 9 10 let selectedImage = info[UIImagePickerController.InfoKey.originalImage] as! UIImage 11 12 self.imageView.image = image 13 UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil) 14 15 //サイズを圧縮する 16 // let resizedImage = selectedImage.scale(byFactor: 0.4) 17 18 image = selectedImage 19 20 var imageHeight = image.size.height 21 var imageWidth = image.size.width 22 23 let navigationBarHeight = navigationController?.navigationBar.frame.height 24 let width = self.view.frame.width 25 let height = self.view.frame.height 26 let centerX = self.view.center.x 27 let centerY = self.view.center.y 28 let widthRatio = imageWidth 29 let heightRatio = imageHeight 30 //画像の大きさに応じてimageviewのサイズを変える 31 if imageHeight > self.view.frame.height || imageWidth > self.view.frame.width { 32 print("1") 33 imageWidth = width 34 imageHeight = width*heightRatio/widthRatio 35 36 } else if imageHeight > self.view.frame.height { 37 print("2") 38 imageHeight = height 39 imageWidth = height*widthRatio/heightRatio 40 41 } else if imageWidth > self.view.frame.width { 42 print("3") 43 imageWidth = width 44 imageHeight = width*heightRatio/widthRatio 45 46 } else { 47 } 48 49 imageView.contentMode = UIView.ContentMode.scaleToFill 50 imageView.frame.size = CGSize(width: imageWidth, height: imageHeight) 51 //画像がnavigationbarに被らないようにする 52 if imageHeight/2 > (height/2 - navigationBarHeight!) { 53 print("4") 54 imageView.center = CGPoint(x: centerX, y: centerY + navigationBarHeight!) 55 } else { 56 print("5") 57 imageView.center = CGPoint(x: centerX, y: centerY) 58 } 59 60 imageView.image = image 61 62 picker.dismiss(animated: true, completion: nil) 63 } 64 65 66 67 // 撮影がキャンセルされた時に呼ばれる 68 func imagePickerControllerDidCancel(_ picker: UIImagePickerController) { 69 picker.dismiss(animated: true, completion: nil) 70 } 71 72 func tappedlibrary() { 73 let sourceType:UIImagePickerController.SourceType = UIImagePickerController.SourceType.photoLibrary 74 75 if UIImagePickerController.isSourceTypeAvailable(UIImagePickerController.SourceType.photoLibrary){ 76 // インスタンスの作成 77 let cameraPicker = UIImagePickerController() 78 cameraPicker.sourceType = sourceType 79 cameraPicker.delegate = self 80 self.present(cameraPicker, animated: true, completion: nil) 81 } 82 else{ 83 print("error") 84 85 } 86 } 87 88 func tappedcamera() { 89 let sourceType:UIImagePickerController.SourceType = UIImagePickerController.SourceType.camera 90 // カメラが利用可能かチェック 91 if UIImagePickerController.isSourceTypeAvailable(UIImagePickerController.SourceType.camera){ 92 // インスタンスの作成 93 let cameraPicker = UIImagePickerController() 94 cameraPicker.sourceType = sourceType 95 cameraPicker.delegate = self 96 self.present(cameraPicker, animated: true, completion: nil) 97 98 } 99 else{ 100 print("error") 101 } 102 } 103 104 @IBAction func selecteImageButton(_ sender: UITapGestureRecognizer) { 105 106 //アラート表示のために 107 let actionSheet = UIAlertController(title: "", message: "写真の選択", preferredStyle: UIAlertController.Style.actionSheet) 108 109 let tappedcamera = UIAlertAction(title: "カメラで撮影", style: UIAlertAction.Style.default, handler: { 110 (action: UIAlertAction!) in 111 self.tappedcamera() 112 }) 113 114 let tappedlibrary = UIAlertAction(title: "ライブラリから選択", style: UIAlertAction.Style.default, handler: { 115 (action: UIAlertAction!) in 116 self.tappedlibrary() 117 }) 118 119 let cancel = UIAlertAction(title: "キャンセル", style: UIAlertAction.Style.cancel, handler: { 120 (action: UIAlertAction!) in 121 print("キャンセル") 122 }) 123 124 actionSheet.addAction(tappedcamera) 125 actionSheet.addAction(tappedlibrary) 126 actionSheet.addAction(cancel) 127 128 present(actionSheet, animated: true, completion: nil) 129 130 } 131 132}

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

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

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

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

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

guest

回答1

0

ベストアンサー

動くかわかりませんが、

UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil)

swift

1if picker.sourceType == .camera { 2 UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil) 3}

のように条件分岐させてカメラの場合だけ保存するようにしてみたらどうでしょう?

投稿2019/12/02 06:26

takabosoft

総合スコア8356

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

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

MashisonJr.

2019/12/02 06:42

ありがとうございます。 試してみたんですけど、この場合1回目にカメラを選択して撮影したときには保存できずに、2回目にまたカメラを選択して撮影したら1回目に撮影した画像が保存されるようになります。 撮影した時に保存できるようにできればいいんですけど。
takabosoft

2019/12/02 06:46

UIImageWriteToSavedPhotosAlbumはたしか非同期で動いた気がする(実際に保存が完了するまでタイムラグがある)ので、待ってれば2枚目も保存されませんかね?
MashisonJr.

2019/12/02 06:54

保存されないですね。 いろいろ確かめるとUse Photoを選択すれば前に撮った画像が保存される感じになっています。
takabosoft

2019/12/02 07:31

あー、imageではなくselectedImageを保存するようにしてください。
MashisonJr.

2019/12/03 00:17

いけました!本当にありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問