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

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

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

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

Swift

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

Q&A

解決済

2回答

1706閲覧

SwiftのLabelのセンタリングについて教えてください

ottotto

総合スコア22

Xcode

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

Swift

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

0グッド

0クリップ

投稿2018/11/15 03:17

編集2018/11/19 02:05

前提・実現したいこと

お世話になっております。
調べてもわからなかったので質問させていただきます。

4つ並べたSubViewの中にLabelを表示させております。
イメージ説明
このように表示は問題なく行えておりますが、センタリングにズレが生じております。

このズレを修正して、どの端末で利用した際も中央に配置されるように変更したいです。

解決案が分かる方がいらっしゃいましたら、回答いただけましたら幸いです。
何卒宜しくお願いします。

該当のソースコード

let myPageView = UIView() myPageView.frame = CGRect(x: 0, y: 0, width: self.view.frame.width/4, height: 50) myPageView.backgroundColor = .white self.view.addSubview(myPageView) myPageView.translatesAutoresizingMaskIntoConstraints = false myPageView.leadingAnchor.constraint( equalTo: self.view.leadingAnchor, constant: 0 ).isActive = true myPageView.centerYAnchor.constraint( equalTo: self.view.topAnchor, constant: 230 ).isActive = true myPageView.widthAnchor.constraint( equalTo: self.view.widthAnchor, multiplier: 0.25 ).isActive = true myPageView.heightAnchor.constraint( equalToConstant: 50.0 ).isActive = true let rightBorder = CALayer() //topBorder.frame = CGRect(x: 0, y: 0, width: myPageView.frame.width, height: 1.0) rightBorder.frame = CGRect(x: myPageView.frame.width, y: 0, width: 1.0, height:myPageView.frame.height) rightBorder.backgroundColor = UIColor.lightGray.cgColor myPageView.layer.addSublayer(rightBorder) //SubViewにlabel要素追加 let postLabel = UILabel() postLabel.text = "投稿" postLabel.frame = CGRect(x: 0, y:0, width:100, height:21) postLabel.textAlignment = .center postLabel.textColor = UIColor.lightGray postLabel.font = UIFont.boldSystemFont(ofSize: 12) myPageView.addSubview(postLabel) let postLabelNum = UILabel() postLabelNum.text = "1234" postLabelNum.frame = CGRect(x: 0, y:20, width:100, height:21) postLabelNum.textAlignment = .center postLabelNum.textColor = UIColor.lightGray postLabelNum.font = UIFont.boldSystemFont(ofSize: 12) myPageView.addSubview(postLabelNum)

試したこと

センタリングにズレが生じている問題は、Labelの幅がsubViewに対して100%の幅以上になっていることが原因で発生しております。
イメージ説明
上記の投稿Viewのように上限以上にwidth幅があるため、postLabelNum.textAlignment = .centerを行なった際に中央の地点がズレます。
これに対してwidth幅を個別の端末のpxに合わせてしまっては端末ごとにやはり中央地点がズレてしまうためwidth幅を指定することでは解決に至りませんでした。

そこで投稿部分のViewareaの幅を100%として取得してくれる書き方を探しましたが、見つかりませんでした。
似たようなコードとしてself.view.bounds.widthを試しましたが、おそらく挙動的にsubViewの幅を認識しているのではなく、ルートビューのサイズに自動調整されてしまいました。

補足情報(FW/ツールのバージョンなど)

xcode9.2

回答に対する補足

let postLabel = UILabel() postLabel.text = "投稿" postLabel.frame = CGRect(x: 0, y:0, width:100, height:21) postLabel.textAlignment = .center postLabel.textColor = UIColor.lightGray postLabel.font = UIFont.boldSystemFont(ofSize: 12) myPageView.addSubview(postLabel) postLabel.translatesAutoresizingMaskIntoConstraints = false postLabel.widthAnchor.constraint( equalTo: self.view.widthAnchor, multiplier: 0.25 ).isActive = true

上記のように2つのUILabelに対してautoLayoutも試しましたが、下記のように空白になってしまいます。
イメージ説明

おそらく記載方法の誤りがあると思うのですが、原因がわかりましたらご教授いただけましたら幸いです。

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

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

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

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

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

fuzzball

2018/11/15 08:15

なぜUILabelもAutolayoutを使わないのでしょうか?
ottotto

2018/11/19 02:06

仕事の都合によって確認が遅れまして大変申し訳ございません。autoLayaoutに関して追記させていただきましたので、もしお時間の都合がよろしければご確認いただけましたら幸いです。
fuzzball

2018/11/19 02:38 編集

widthの制約を付けただけでしょうか?それだとエラーが出ていないでしょうか?Autolayout理解できてますか?ある程度理解できるまではStoryboardやxibで制約を付けた方がいいと思いますよ。
ottotto

2018/11/19 02:59

autolayoutの認識不足でした。ついCSSのような感覚でコードを記載しておりましたが、autolayoutの性質通り全ての要素に対して制約を設けることで無事にセンタリングすることができました。この度は回答誠にありがとうございました。
fuzzball

2018/11/19 04:05

ここは回答欄ではありませんので、解決したのであれば回答を書いて自己解決にして下さい。
guest

回答2

0

こうです

イメージ説明

投稿2018/11/15 08:05

kosanai

総合スコア471

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

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

ottotto

2018/11/19 01:43

図付きのわかりやすい回答誠にありがとうございます。また仕事の関係で確認が遅れまして大変申し訳ございません。 早速stackviewをコードで書いてみたのですが、autolayoutが打ち消されてしまいレイアウト崩れを起こしてしまいました。 autolayoutとstackviewは共存させることはできるのでしょうか? 初歩的な質問で申し訳ございません。
guest

0

自己解決

UILabelに対してAutoLayoutを適用することで解決しました。
この度はありがとうございました。

投稿2018/11/19 04:07

ottotto

総合スコア22

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問