回答編集履歴

2

誤字・表記揺れの修正

2020/11/02 08:07

投稿

TsukubaDepot
TsukubaDepot

スコア5086

test CHANGED
@@ -80,15 +80,15 @@
80
80
 
81
81
 
82
82
 
83
- と記述すると、`frame`などに値を設定しても、その値は適切に設定されません。Autolayout で計算された値が優先されるからだと思います(一方、Autolauout の結果として `frame` や `bounce` の値は参照可能です)。
83
+ と記述すると、`frame`などに値を設定しても、その値は適切に設定されません。Autolayout で計算された値が優先されるからだと思います(一方、AutoLayout の結果として `frame` や `bounce` の値は参照可能です)。
84
84
 
85
85
 
86
86
 
87
- つまり、一度 Autolayout を使うと決めたら、全てを「制約」として設定しなければならないと考えています。
87
+ つまり、一度 AutoLayout を使うと決めたら、全てを「制約」として設定しなければならないと考えています。
88
88
 
89
89
 
90
90
 
91
- `yearLabel` を Autolayout で設定するとなると、`CGRect` で設定した座標も無効になりますので、再度制約をかけるなどして部品の相対的な位置を決める必要があるのではないでしょうか。
91
+ `yearLabel` を AutoLayout で設定するとなると、`CGRect` で設定した座標も無効になりますので、再度制約をかけるなどして部品の相対的な位置を決める必要があるのではないでしょうか。
92
92
 
93
93
 
94
94
 

1

解決策を提示

2020/11/02 08:07

投稿

TsukubaDepot
TsukubaDepot

スコア5086

test CHANGED
@@ -33,3 +33,79 @@
33
33
 
34
34
 
35
35
  みたいな制約を追加すれば、とりあえず全ての高さを 50 ピクセル固定にできますので、先頭のラベルと同じ高さにすることは可能です(ただし、根本的な解決とは言えないかと思いますので、その点はご注意ください)。
36
+
37
+
38
+
39
+ ##2020年11月2日追記
40
+
41
+
42
+
43
+ ```Swift
44
+
45
+ yearLabel.translatesAutoresizingMaskIntoConstraints = false
46
+
47
+ ```
48
+
49
+
50
+
51
+ とした場合、おそらくラベルは消えたのではなく、左上を原点として再配置されたのだと思います。ただし、私のコードはご提示いただいたコードをもとに再現しただけなので、質問者さんの環境とは異なっている可能性がありますし、設定次第では描画範囲内から消えてしまった可能性もあります。
52
+
53
+
54
+
55
+ シミュレータで実行中に「View Hierarchy」のボタンを押すと、その時に表示されているビューの構造を視覚的に見ることが可能となります(下図左下のボタン)。
56
+
57
+
58
+
59
+ ![イメージ説明](615b451b4c10ac3690ffe765d4e52913.png)
60
+
61
+
62
+
63
+ このとき、右上や左側ペインに表示されたUI部品の部分に紫色の警告が出ますが、その内容は **[Position is ambiguous]** 、つまり**座標が曖昧だ**ということです。
64
+
65
+
66
+
67
+ 5つのラベル全てに出ていますが、おそらくほかの4つのラベルの基準となる `yearLabel` の座標をきちんと設定すれば、のこり4つの制約に対する曖昧さは解消すると思います。
68
+
69
+
70
+
71
+ 先にも回答しました通り、
72
+
73
+
74
+
75
+ ```Swift
76
+
77
+ yearLabel.translatesAutoresizingMaskIntoConstraints = false
78
+
79
+ ```
80
+
81
+
82
+
83
+ と記述すると、`frame`などに値を設定しても、その値は適切に設定されません。Autolayout で計算された値が優先されるからだと思います(一方、Autolauout の結果として `frame` や `bounce` の値は参照可能です)。
84
+
85
+
86
+
87
+ つまり、一度 Autolayout を使うと決めたら、全てを「制約」として設定しなければならないと考えています。
88
+
89
+
90
+
91
+ `yearLabel` を Autolayout で設定するとなると、`CGRect` で設定した座標も無効になりますので、再度制約をかけるなどして部品の相対的な位置を決める必要があるのではないでしょうか。
92
+
93
+
94
+
95
+ きちんと計算していないので間違っている可能性もありますが、たとえばこのような感じで `yearLabel` の制約を設定すると解決するかと思います。
96
+
97
+
98
+
99
+ ```Swift
100
+
101
+ yearLabel.translatesAutoresizingMaskIntoConstraints = false
102
+
103
+
104
+
105
+ yearLabel.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: view.frame.height * 0.1138).isActive = true
106
+
107
+ yearLabel.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor, constant: view.frame.width * 0.0531).isActive = true
108
+
109
+ yearLabel.heightAnchor.constraint(equalToConstant: 50).isActive = true
110
+
111
+ ```