質問: info[UIImagePickerController.InfoKey.originalImage] as? UIImage // (3)モーダルビューを閉じる dismiss(animated: true, completion: nil) } } ```
回答: 症状を確認しました。 カメラで撮影した画像の大きさが Twitter の規定サイズを超えていたため、途中で落ちていたようです。 たしかに、コメントで参考にされた Qiita の記事の通りなのですが、この記事はさらに参考にすべきところがありますので、ソースコードにはそれも反映させる必要があります。 まずは、圧縮処理を行わせるためのコードを追加する必要があります。 これは、 * [Swift] iPhoneの写真をAPIにPOSTする際の、上下反転問題とファイルサイズ制限への対策 の通りなのですが、一部 Swift5 ではメソッド名(関数名)が変わっているようですので、次のように変更する必要があります。 ``` extension UIImage { /// 上下逆になった画像を反転する func fixedOrientation() -> UIImage? { if self.imageOrientation == UIImage.Orientation.up { return self } UIGraphicsBeginImageContextWithOptions(self.size, false, scale) self.draw(in: CGRect(x: 0, y: 0, width: self.size.width, height: self.size.height)) guard let newImage = UIGraphicsGetImageFromCurrentImageContext() else { return nil } UIGraphicsEndImageContext() return newImage } /// イメージ縮小 func resizeImage(maxSize: Int) -> UIImage? { guard let jpg = self.jpegData(compressionQuality: 1) as NSData? else { return nil } if isLessThanMaxByte(data: jpg, maxDataByte: maxSize) { return self } // 80%に圧縮 let _size: CGSize = CGSize(width: (self.size.width * 0.8), height: (self.size.height * 0.8)) UIGraphicsBeginImageContext(_size) self.draw(in: CGRect(x: 0, y: 0, width: _size.width, height: _size.height)) guard let newImage = UIGraphicsGetImageFromCurrentImageContext() else { return nil } UIGraphicsEndImageContext() // 再帰処理 return newImage.resizeImage(maxSize: maxSize) } /// 最大容量チェック func isLessThanMaxByte(data: NSData?, maxDataByte: Int) -> Bool { if maxDataByte <= 0 { // 最大容量の指定が無い場合はOK扱い return true } guard let data = data else { fatalError("Data unwrap error") } if data.length < maxDataByte { // 最大容量未満:OK ※以下でも良いがバッファを取ることにした return true } // 最大容量以上:NG return false } } ``` 上記のコードは、ViewController.swift の末尾に追加して大丈夫です。 また、画像をシェアする部分のコードは次のように変更します。 ``` @IBAction func shareButtonAction(_ sender: Any) { // 表示画像をアンラップしてシェア画像を取り出す if let shareImage = pictureImage.image { // MARK: 5MB以内に収める let resizedImage = shareImage.fixedOrientation()?.resizeImage(maxSize: 5 * 1024 * 1024) // UIActivityViewControllerに渡す配列を作成 // MARK: 圧縮後の画像を配列に入れる let shareItems = [resizedImage!] // UIActivityViewControllerにシェア画像を渡す let controller = UIActivityViewController(activityItems: shareItems, applicationActivities: nil) //iPadで落ちてしまう対策 controller.popoverPresentationController?.sourceView = view //UIActivityViewControllerを表示 present(controller, animated: true, completion: nil) } } ``` ここで、`MARK:`と書かれた部分が新たに追記したコードです。なお、一次参照された記事だと `resizeImage(maxsize:)`の指定がなかったのですが、実際は必要となりますのでそのように書き換えてあります。 これでおそらく問題なく投稿できるようになるかと思います。 ところで、参考にされた書籍ですが、サポート体制が非常にしっかりしているようです。 * 【初心者本】Xcodeの使い方から学ぶ、iPhone(iOS)アプリ開発の入門書!たった2日でマスターできる iPhoneアプリ開発集中講座 Xcode 11/Swift 5対応(2019年10月出版)公式サポートページ こちらに正誤表があり、かりに Xcode のバージョンアップに伴う動作不具合であっても、対処方法がきちんと掲載されています。 私が半年くらい前に見たときには Twitter のことは記載されていませんでしたし、問題も起きなかったのですが、おそらく現在の環境では発生してしまう可能性が高いと思います。 この半年間で起き得るトラブルについても、正誤表できちんと触れられていますので、是非お問い合わせフォームからも今回のトラブルについて質問者さんからお問い合わせいただければ、さらに適切な回答が得られるかと思います。