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

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

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

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

Q&A

解決済

1回答

1776閲覧

【Swift】撮影した写真をシェアする方法

lucia0320

総合スコア15

Swift

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

0グッド

0クリップ

投稿2020/07/14 14:00

参考書の通りに以下のコードを打ったのですが
撮影した写真をTwitterに投稿することができません。

どこか間違っているのでしょうか・・・・。

教えてください。

Swift

1import UIKit 2 3class ViewController: UIViewController , UINavigationControllerDelegate , UIImagePickerControllerDelegate { 4 5 override func viewDidLoad() { 6 super.viewDidLoad() 7 // Do any additional setup after loading the view. 8 } 9 10 @IBOutlet weak var pictureImage: UIImageView! 11 12 13 // カメラを起動するをタップすると起動 14 @IBAction func cameraButtonAction(_ sender: Any) { 15 // カメラが利用可能かチェック 16 if UIImagePickerController.isSourceTypeAvailable(.camera) { 17 print("カメラは利用できます") 18 // (1)UIImagePickerControllerのインスタンスを作成 19 let imagePickerController = UIImagePickerController() 20 // (2)sourceTypeにcameraを設定 21 imagePickerController.sourceType = .camera 22 // (3)delegate設定 23 imagePickerController.delegate = self 24 // (4)モーダルビューで表示 25 present(imagePickerController, animated: true, completion: nil) 26 } else { 27 print("カメラがは利用できません") 28 } 29 } 30 31 // SNSに投稿するをタップすると実行 32 @IBAction func shareButtonAction(_ sender: Any) { 33 // 表示画像をアンラップしてシェア画像を取り出す 34 if let shareImage = pictureImage.image { 35 // UIActivityViewControllerに渡す配列を作成 36 let shareItems = [shareImage] 37 // resizeをする 38 39 // UIActivityViewControllerにシェア画像を渡す 40 let controller = UIActivityViewController(activityItems: shareItems, applicationActivities: nil) 41 //iPadで落ちてしまう対策 42 controller.popoverPresentationController?.sourceView = view 43 //UIActivityViewControllerを表示 44 present(controller, animated: true, completion: nil) 45 } 46 } 47 48 // (1)機能が終わったあとに呼ばれるdelegateメソッド 49 func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info:[UIImagePickerController.InfoKey : Any]){ 50 // (2)撮影した画像を配置したpictureImageに渡す 51 pictureImage.image = info[UIImagePickerController.InfoKey.originalImage] as? UIImage 52 // (3)モーダルビューを閉じる 53 dismiss(animated: true, completion: nil) 54 } 55 56}

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

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

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

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

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

TsukubaDepot

2020/07/14 20:21

前回も指摘いたしましたが、参考になさっている書籍名(「たった2日でできる..」だと思いますが)をご質問本文にご記入いただければと思います。 ところで、このコードで間違いありません。 私の環境だときちんと Twitter に投稿できました。 ところで、lucia0320が試された環境には Twitter は入っていますでしょうか。Twitter社によるTwitterアプリです。
lucia0320

2020/07/15 00:53 編集

申し訳ございません。なんとなく書籍名を書くのが憚れまして・・・。 はい、Twitterは入っています。毎日やっておりますので・・・。 iPhone7でiOSは最新(13.5.1)です。 SNSに投稿を押して、Twitterアイコンを押すと 一瞬Twitterアプリの投稿画面になるのですが、また共有画面(アイコン選択画面)に戻ってしまいます。 ちなみにLINEの共有はできました。
TsukubaDepot

2020/07/15 01:04

投稿していただいたコードを使いそのままビルドし、実機で動作させて確認したのですが、Twitter に投稿する画面まで出てきますし、実際に投稿もできました。 質問者さんの環境だと、投稿画面にもならない、ということでしょうか。 それとも、投稿画面切り替わるが、その画面がすぐにきえてしまうということでしょうか。 「また共有画面(アイコン選択画面)に戻ってしまいます」ということなので、後者のほうかとは思いますが。 LINEに投稿できるのであれば、Twitter側の問題かもしれません。私のTwitterはバージョン8.26です。 しかし、もしTwitterに投稿できなければ支障がある、ということでなければ、同じような共有を使うLINEでは実行できていますので、現時点では問題据え置きということでいかがでしょうか。 この問題の解決に労力を避けるよりも、次のレッスンに進まれた方が実益があるかとおもいます。 ちなみに、書籍名はご面倒でも都度書かれた方が良いかと思います。 時々、書籍などの教材に問題があることもありますので。
lucia0320

2020/07/15 01:59 編集

分かりました。ありがとうございます。 次回から書籍名を明記いたします。 ちなみに下記のエラーがTwitterアイコンを押したときに出ていたのですが参考になりますでしょうか。 2020-07-15 10:03:25.962046+0900 MyCamera[18359:2286135] [core] SLRemoteComposeViewController: (this may be harmless) viewServiceDidTerminateWithError: Error Domain=_UIViewServiceInterfaceErrorDomain Code=3 "(null)" UserInfo={Message=Service Connection Interrupted} 2020-07-15 10:03:25.962137+0900 MyCamera[18359:2286135] viewServiceDidTerminateWithError:: Error Domain=_UIViewServiceInterfaceErrorDomain Code=3 "(null)" UserInfo={Message=Service Connection Interrupted} また、これが原因かわからないのですが 調べていたら下記のサイトを見つけました。 https://qiita.com/iceApp/items/658f5ccf27f99ce64867 当該サイトでは画像のリサイズをするとのことで 下記のコードを追加したのですが、私の書き方が悪いのかエラーになってしまいます・・・。 let resizeImage = shareItems?.fixedOrientation()?.shareItems()
fuzzball

2020/07/15 03:51

>>次回から書籍名を明記いたします。 今回から記載して下さい。
guest

回答1

0

ベストアンサー

症状を確認しました。
カメラで撮影した画像の大きさが Twitter の規定サイズを超えていたため、途中で落ちていたようです。

たしかに、コメントで参考にされた Qiita の記事の通りなのですが、この記事はさらに参考にすべきところがありますので、ソースコードにはそれも反映させる必要があります。

まずは、圧縮処理を行わせるためのコードを追加する必要があります。
これは、

の通りなのですが、一部 Swift5 ではメソッド名(関数名)が変わっているようですので、次のように変更する必要があります。

Swift

1extension UIImage { 2 3 /// 上下逆になった画像を反転する 4 func fixedOrientation() -> UIImage? { 5 if self.imageOrientation == UIImage.Orientation.up { 6 return self 7 } 8 UIGraphicsBeginImageContextWithOptions(self.size, false, scale) 9 self.draw(in: CGRect(x: 0, y: 0, width: self.size.width, height: self.size.height)) 10 guard let newImage = UIGraphicsGetImageFromCurrentImageContext() else { 11 return nil 12 } 13 UIGraphicsEndImageContext() 14 return newImage 15 } 16 17 /// イメージ縮小 18 func resizeImage(maxSize: Int) -> UIImage? { 19 20 guard let jpg = self.jpegData(compressionQuality: 1) as NSData? else { 21 return nil 22 } 23 if isLessThanMaxByte(data: jpg, maxDataByte: maxSize) { 24 return self 25 } 26 // 80%に圧縮 27 let _size: CGSize = CGSize(width: (self.size.width * 0.8), height: (self.size.height * 0.8)) 28 UIGraphicsBeginImageContext(_size) 29 self.draw(in: CGRect(x: 0, y: 0, width: _size.width, height: _size.height)) 30 guard let newImage = UIGraphicsGetImageFromCurrentImageContext() else { 31 return nil 32 } 33 UIGraphicsEndImageContext() 34 // 再帰処理 35 return newImage.resizeImage(maxSize: maxSize) 36 } 37 38 /// 最大容量チェック 39 func isLessThanMaxByte(data: NSData?, maxDataByte: Int) -> Bool { 40 41 if maxDataByte <= 0 { 42 // 最大容量の指定が無い場合はOK扱い 43 return true 44 } 45 guard let data = data else { 46 fatalError("Data unwrap error") 47 } 48 if data.length < maxDataByte { 49 // 最大容量未満:OK ※以下でも良いがバッファを取ることにした 50 return true 51 } 52 // 最大容量以上:NG 53 return false 54 } 55}

上記のコードは、ViewController.swift の末尾に追加して大丈夫です。

また、画像をシェアする部分のコードは次のように変更します。

Swift

1@IBAction func shareButtonAction(_ sender: Any) { 2 // 表示画像をアンラップしてシェア画像を取り出す 3 if let shareImage = pictureImage.image { 4 5 // MARK: 5MB以内に収める 6 let resizedImage = shareImage.fixedOrientation()?.resizeImage(maxSize: 5 * 1024 * 1024) 7 // UIActivityViewControllerに渡す配列を作成 8 // MARK: 圧縮後の画像を配列に入れる 9 let shareItems = [resizedImage!] 10 11 // UIActivityViewControllerにシェア画像を渡す 12 let controller = UIActivityViewController(activityItems: shareItems, applicationActivities: nil) 13 //iPadで落ちてしまう対策 14 controller.popoverPresentationController?.sourceView = view 15 //UIActivityViewControllerを表示 16 present(controller, animated: true, completion: nil) 17 } 18 }

ここで、MARK: と書かれた部分が新たに追記したコードです。なお、一次参照された記事だと resizeImage(maxsize:)の指定がなかったのですが、実際は必要となりますのでそのように書き換えてあります。

これでおそらく問題なく投稿できるようになるかと思います。

ところで、参考にされた書籍ですが、サポート体制が非常にしっかりしているようです。

こちらに正誤表があり、かりに Xcode のバージョンアップに伴う動作不具合であっても、対処方法がきちんと掲載されています。

私が半年くらい前に見たときには Twitter のことは記載されていませんでしたし、問題も起きなかったのですが、おそらく現在の環境では発生してしまう可能性が高いと思います。

この半年間で起き得るトラブルについても、正誤表できちんと触れられていますので、是非お問い合わせフォームからも今回のトラブルについて質問者さんからお問い合わせいただければ、さらに適切な回答が得られるかと思います。

投稿2020/07/15 03:28

TsukubaDepot

総合スコア5086

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

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

lucia0320

2020/07/15 03:54

TsukubaDepot様 ご回答ありがとうございます。 長い時間とらせてしまって申し訳ございませんでした。 いただいたコードで無事動作できました。 また書籍についてもご教示頂き重ね重ねお礼を申し上げます。 どうぞ宜しくお願いいたします。
TsukubaDepot

2020/07/15 04:04 編集

うまく動かない原因は、今回のように必ずしも読者に責任がない場合もかなりあります(他言語だと、コンパイルすら通らないコードが掲載されている本もあるようです)。 書籍名が記載されていない場合、全てが質問者さんのミスと想定され、思わぬ被害を被ることもありますから、是非書籍名の記述をお願いしたいと思います。
lucia0320

2020/07/15 09:46

ありがとうございます。 承知しました。 初めての書籍でここで躓くとは・・・。と幸先不安だったので この度は大変助かりました。 今後とも宜しくお願い申し上げます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問