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

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

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

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

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

Q&A

解決済

1回答

2982閲覧

UILabel 左寄せ

Larry

総合スコア28

iOS

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

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

0グッド

0クリップ

投稿2019/04/01 14:14

前提・実現したいこと

[swift]
<あらかじめ用意した文章をチャット風に表示>

Label内の文字を左寄せかつラベルの中心に表示させたい

発生している問題・エラーメッセージ!

Labelに関してはstoryboardは使用せず、コードにて表示させています。
下記のコードではラベル内の文章は左寄りになって揃っていますが、ラベルの左側と文字との間隔が狭すぎて、見辛くなってしまいます。
左寄せ
かといってlabel.textAlignment = NSTextAlignment.centerとしてセンター寄りにするとラベルと文字との余白はいい感じになりますが、2行目以降の文章が中心にきてしまいます。
中央寄せ

理想はLINEやその他チャットアプリのような感じです。

該当のソースコード

import UIKit let leibun = [(title: "てすと", items: ["あいあいあいあいああいあいあい", "うえうえうえうえうえうえうえうえうえうえうえうえうえうえうえうええうえうえ","えおえおえおえおえおえおえおえおえおえおええおえおえおえお","おあおあおあおあおあおあおあおあおあおあ","お","かかかかかかかかかかかかかかかかかかかかかかかかかかか","けけけけけけけけけけけけけけけけけけけけけけけけけけけけけけけけけけけけけけけけけけけけけけけ",]), ] class ViewController: UIViewController { var i = 0 var j = 0 var unknown = 50 var labelsize = 0 @IBAction func tapScreen(_ sender: Any) { let label = UILabel() if i == leibun[j].items.count { return; }; if i%2 == 0 { label.font = label.font.withSize(16) label.text = "(leibun[j].items[i])" label.textColor = UIColor.black label.backgroundColor = UIColor.yellow label.layer.cornerRadius = 15 label.clipsToBounds = true label.layer.borderWidth = 1 label.layer.borderColor = UIColor.brown.cgColor label.sizeToFit() //300超えたらラベルを制御(仮) labelsize = Int(label.frame.width) if labelsize >= 300 { label.numberOfLines = 0 label.lineBreakMode = .byCharWrapping label.frame.size.width = 300 label.sizeToFit() label.frame.size.height += 15 label.frame.size.width += 40 } else { label.sizeToFit() label.frame.size.height += 15 label.frame.size.width += 20 } label.frame.origin.x = CGFloat(view.frame.origin.x + view.frame.size.width-label.frame.width-15) label.frame.origin.y = CGFloat(unknown) label.textAlignment = NSTextAlignment.left label.numberOfLines = 0 self.view.addSubview(label) }; if i%2 == 1 { label.font = label.font.withSize(16) label.text = "(leibun[j].items[i])" label.textColor = UIColor.white label.backgroundColor = UIColor.gray label.layer.cornerRadius = 15 label.clipsToBounds = true label.layer.borderWidth = 1 label.layer.borderColor = UIColor.black.cgColor label.sizeToFit() //300超えたらラベルを制御(仮) labelsize = Int(label.frame.width) if labelsize >= 300 { label.numberOfLines = 0 label.lineBreakMode = .byCharWrapping label.frame.size.width = 300 label.sizeToFit() label.frame.size.height += 15 label.frame.size.width += 40 } else { label.sizeToFit() label.frame.size.height += 15 label.frame.size.width += 20 } label.frame.origin.x = CGFloat(15) label.frame.origin.y = CGFloat(unknown) label.textAlignment = NSTextAlignment.left label.numberOfLines = 0 self.view.addSubview(label) }; i = i + 1 unknown = Int(label.frame.height) + Int(label.frame.origin.y) + 15 } override func viewDidLoad() { super.viewDidLoad() } }

試したこと

文章の先頭に空白を入れてラベル内に表示される位置をずらすという方法はありますが、力技ですし、あまり利用したくありません。文章が長くなるとその文作業が増えてしまいますので、手間がかかってしまいます。

ご教授いただければ幸いです。よろしくお願いします

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

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

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

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

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

guest

回答1

0

ベストアンサー

ラベルだけで枠まで表現するのではなくて、背景枠はUIViewで作成してその子としてUILabelを入れ、ラベルの背景などはClearにします。
そうすれば枠からのオフセットは親のUIViewからUILabelまでの距離なので好きに変更できます。

Swift

1let frameView = UIView() 2 3// frameViewはbackgroundColorやcornerRadiusなどを設定 4 5let label = UILabel() 6label.backgroundColor = UIColor.clear 7label.text = "~" 8label.sizeToFit() 9var lr = label.frame 10 11// labelの親(frameView)からの距離(15, 15) 12lr.origin.x = 15 13lr.origin.y = 15 14label.frame = lr 15 16var vr = lr; 17vr.origin.y = 表示位置適当に設定 18vr.origin.x = 表示位置適当に設定 19 20// frameViewのサイズはラベルのサイズ+上下/左右のマージン 21vr.size.width = lr.size.width + 30 22vr.size.height = lr.size.height + 30 23frameView.frame = vr 24 25// self.viewの子として frameView を追加、frameViewの子としてlabelを追加 26frameView.addSubView(label) 27self.view.addSubview(frameView)

投稿2019/04/01 14:32

編集2019/04/01 16:03
toki_td

総合スコア2850

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

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

Larry

2019/04/01 14:50

早速回答ありがとうございます!一つ分からないことがあります。 「UIViewで作成してその子としてUILabelを入れ」というのは具体的にどのような方法ですか?もう少し詳細な説明をしていただけると助かります。イメージとしてはUIViewで枠を作ってその上に透明なラベルを乗せるような感じですよね?単純にそれぞれ独立させてuiviewはuiviewで、labelはlabelで作成して二つを重ねるということですか?
toki_td

2019/04/01 16:06 編集

重ねるのではなく子にします。UIViewが枠を持ち、その中の子としてUILabelがテキストを表示します。 ざっくりですがコード例追加しました。 UIViewの階層などを理解されてなかったらaddSubViewなどで調べてください。 レイアウトは本来ならAutoLayoutなどを使用したほうがいいかと思いますが。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問