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

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

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

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

Q&A

解決済

1回答

6637閲覧

【swift】UIAlertControllerのmessageに画像を表示させたい

nkrmn_a

総合スコア27

Swift

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

0グッド

0クリップ

投稿2020/05/21 02:20

前提・実現したいこと

ボタンとして使っている画像image.jpgをUIAlertControllerのmessage中に表示させたいです。

該当のソースコード

swift

1let text = "をタップして設定してください" 2let image = UIImage(named: "image.jpg")! 3let font: UIFont = .systemFont(ofSize: 14) 4let size = CGSize(width: 20, height: 20) 5 6let attachment = NSTextAttachment() 7attachment.image = image 8 9let y = (font.capHeight-size.height).rounded() / 2 10attachment.bounds.origin = CGPoint(x: 0, y: y) 11attachment.bounds.size = size 12 13let imageAttribute = NSAttributedString(attachment: attachment) 14let mutableString = NSMutableAttributedString(string: text) 15mutableString.insert(imageAttribute, at: 0) 16 17//アラート 18alert(title: "未設定です", message: mutableString)

試したこと

labelに画像を埋め込んで表示する方法を参考に作りましたが、アラートのmessageの部分にmutableStringを入れるとエラーが起きてしまいます。
UIAlertControllerにはNSAttributedStringやNSMutableAttributedStringは埋め込めないというような情報も出てきました。
そもそも私がやりたいことは実現可能なのでしょうか?それとも別の方法があるのでしょうか。
調べても分からなかったので教えていただきたいです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

可能か不可能かでいえば可能です。ただ UIAlertController を使うのではなく、目的に合致するようにカスタマイズしたアラートダイアログ画面を実装した方が良いかと思います。


ボタン部分に画像を追加する場合は下記の通りです。

let alert = UIAlertController(title: "タイトル", message: "メッセージ", preferredStyle: .alert) let image = UIImage(systemName: "person") let action = UIAlertAction(title: "OK", style: .default, handler: nil) action.setValue(image, forKey: "image") alert.addAction(action) present(alert, animated: true, completion: nil)

イメージ説明

タイトル・メッセージ部分に画像を差し込む場合は下記の通りです。

let alert = UIAlertController(title: "タイトル", message: "メッセージ", preferredStyle: .alert) alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil)) let image = UIImage(systemName: "person") let imageView = UIImageView(frame: CGRect(x: 10, y: 10, width: 64, height: 64)) imageView.image = image alert.view.addSubview(imageView) present(alert, animated: true, completion: nil)

イメージ説明

メッセージ部分にNSAttributedStringを差し込む場合は下記の通りです。

let alert = UIAlertController(title: "タイトル", message: "メッセージ", preferredStyle: .alert) alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil)) let message = NSMutableAttributedString() message.append(NSAttributedString(string: "テスト →")) let attachment = NSTextAttachment() attachment.image = UIImage(systemName: "person") attachment.bounds.origin = CGPoint(x: 0, y: 0) attachment.bounds.size = CGSize(width: 10, height: 10) message.append(NSAttributedString(attachment: attachment)) message.append(NSAttributedString(string: "← テスト")) alert.setValue(message, forKey: "attributedMessage") present(alert, animated: true, completion: nil)

イメージ説明

動作確認環境

下記の環境で動作検証をおこないました。

  • Xcode 11.5
  • iOS 13.5シミュレータ

投稿2020/05/21 11:40

編集2020/05/22 01:33
ch3cooh

総合スコア287

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

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

nkrmn_a

2020/05/22 01:18

ありがとうございます。質問が分かりづらく恐縮ですが、タイトル・メッセージ部分に画像を差し込むというよりは、メッセージの文中に画像を差し込むのは可能か?ということでした。 しかしカスタムするのは考えていませんでした。参考にさせていただきます。
ch3cooh

2020/05/22 01:42

回答に追記しました。 「実現可能か」の問いの答えとして書きましたが、ドキュメントで非推奨と書かれている手法ですので、ストアへ申請するタイプのアプリで使うのは避けた方が良いかと思われます。 過去にも https://qiita.com/dotwhim/items/2458c2cb9161a10a3f28 のような事例があり、UIAlertControllerをカスタマイズして使っているとiOSのアップデートでアプリがクラッシュするようになってしまうことを懸念しています。
nkrmn_a

2020/05/22 02:13

重ね重ねありがとうございます。 なるほど、ストアへ申請するタイプではないのですがiOSのアプデでクラッシュするのは課題としては大きいですね…。ともあれ、教えてくださりありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問