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

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

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

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

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

Q&A

解決済

3回答

5094閲覧

【Swift】widthが可変のUILabel同士を組み合わせたレイアウト方法

Kesth

総合スコア83

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

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

0グッド

1クリップ

投稿2015/08/04 09:27

編集2015/08/04 09:38

こんにちは。
Swiftを使って開発を進めているものです。
今回質問させていただきたいのが、widthが可変のUILabelを
組み合わせたレイアウトの方法についてです。

現在アプリの制作をしており、SNSなどでよくある「通知画面」のようなもの
UITableViewとCustomCellを使用して作成しています。

例えば、Facebookで「◯◯さんがあなたの写真についてイイネ!と言っています。」
みたいな通知が来た場合、通知画面(地球儀のマークのTab)を押すと通知内容が表示されますが、
そのレイアウトとしては以下のような構成かと思います。

イメージ説明

このレイアウトのうち、「UILabel(ユーザー名)とULabel(通知の詳細)」の部分の
組み合わせの実装の仕方について質問させていただきたいのですが、
以下の点がひっかかってしまい、実装が行き詰まっている状態です。

【問題点】
「UILabel(ユーザー名)はユーザーの入力によってwidthが可変となる点」
→このためUILabel(ユーザー名)のwidthを指定できず、そのwidth分だけズラして
UILabel(通知内容)を隣接して配置させることが厳しい。
また、仮にwidth分ズラして配置した場合、折り返した2行目の開始地点も
そこから開始されるため、レイアウトが上記のようにいかず、
下記のように崩れてしまう。

【誤】田中太郎さんが、あなたの写真について
( 空白 )イイネといっています。

【正】田中太郎さんが、あなたの写真について
イイネといっています。

Facebookの通知表示のように、可変のUILabel同士でも上手く組み合わせて
動的なレイアウトにし、かつセル内でテキストの折り返しが行われた場合でも上記の【正】レイアウトになるような実装方法について教えて頂ければ助かります。

よろしくお願いします。

※ストーリボードは使わず全てコードで実装しています。

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

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

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

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

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

guest

回答3

0

テキストやUIの文字列を一部装飾するにはNSAttributedStringクラス、またはNSMutableAttributedStringクラスを使用しましょう。
今回はフォント・色ということなので後者を使います。(一度に複数の装飾設定もできるので、前者でも可能)

//UILabelの変数名はlabel、Stringの変数名はuserNameとします。 let attributedString = NSMutableAttributedString(string: self.label.text!) let length = count(userName)//userNameの文字列長を取得 //フォントの装飾 attributedString.addAttribute( NSFontAttributeName, //付加する装飾の属性 value: UIFont(name: "フォント名", size: サイズ)!,//付加する装飾 range: NSMakeRange(0, length))//その範囲 //文字色の装飾 attributedString.addAttribute( NSFontAttributeName, //付加する装飾の属性 value: UIColor.redColor(),//付加する装飾(例: 赤) range: NSMakeRange(0, length))//上記同様 //対象のUILabelに反映 self.label.attributedText = attributedString //addSubViewされていなければ //self.view.addSubView(self.label)

以上の工程で文字列を装飾が可能です。一部を装飾する場合は範囲を指定しましょう。
コードを乗せるので回答に投稿されて頂きました、ご了承ください。

投稿2015/08/06 05:33

at1994

総合スコア202

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

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

Kesth

2015/08/06 06:35

度々ありがとうございます! 助かりました! 今後ともよろしくお願いします。
guest

0

ベストアンサー

let userName = "userName" let notificationDetail = "detail" let label = UILabel(frame: CGRectZero)//frameはご自由にどうぞ label.text = "\(userName)さんが、\(notificationDetail)と言っています。" //テキストのサイズに合わせる label.sizeToFit()

サイズをテキストの内容によって動的に変更するのであればsizeToFitメソッドでも可能です。
表示の際はUILabel1つにまとめた方がいいと思います!

UIGestureRecognizerでのタップ処理は、

let tap = UITapGestureRecognizer(target: self, action: "tap:") label.addGestureRecognizer(tap)

などでタップを検出する対象にaddGestureRecognizerすることで、タップ検出した際にactionで渡したSelectorが呼ばれます。
actionで渡したSelectorの実装を行ないましょう。
"tap:" はtapという名前で引数1つあるメソッドという意味を指します。

func tap(sender: UIGestureRecognizer) { //タップを検出した時の処理 }

投稿2015/08/04 14:28

編集2015/08/04 14:39
at1994

総合スコア202

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

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

Kesth

2015/08/04 15:32

詳しくありがとうございます! こちらの方法で試してみたいと思います。 お陰様でなんとか実装できそうです、ありがとうございました!
Kesth

2015/08/06 04:38

すみません、もう1点ほどよろしいでしょうか。 let userName = "userName" let notificationDetail = "detail" let label = UILabel(frame: CGRectZero)//frameはご自由にどうぞ label.text = "\(userName)さんが、\(notificationDetail)と言っています。" //テキストのサイズに合わせる label.sizeToFit() 上記の方法で実装が無事出来たのですが、\(userName)部分のみのテキストの色やフォントを変更したい場合、どのように実装すればよろしいでしょうか?
guest

0

ユーザー名用のUILabelと、通知内容用のUILabelを1つにまとめてしまって、attributedTextにて、ユーザー名部分を修飾するようにしてはいかがでしょう。

投稿2015/08/04 10:29

terushu

総合スコア358

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

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

Kesth

2015/08/04 11:21

そんな方法があったんですね! まだ開発始めて間もないのでとても勉強になります。 調べてやってみます。 ちなみに、ユーザー名用のUILabelをUIButtonに変えて、「UIButton(ユーザー名用)+UILabel(通知内容)」の組み合わせで同様のことをやるとすると、どんな実装方法になりますでしょうか? 度々お手数お掛けしますが、教えて頂けると幸いです。
terushu

2015/08/04 12:04

表示用のUILabelは私がさきほど提案させていただいた方法のままで、改めて透明なUIButtonをユーザー名用部分の上に追加するのではどうでしょう。 ボタンのサイズはユーザー名文字列から算出する必要はあります。 もしくは、UILabelのタッチイベントを捕まえるなり、UITapGestureRecognizerを追加するなりして、ユーザー名表示部分がタップされたら処理を行うようにしても良いと思います。
Kesth

2015/08/04 15:34

ありがとうございます! なるほど、透明なUIButtonを被せるという形も考えられるんですね。 UITapGestureRecognizerについてはまだ扱ったことがないのでちょっと調べてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問