回答編集履歴

4

大幅修正

2019/01/05 07:51

投稿

hameji001
hameji001

スコア639

test CHANGED
@@ -157,3 +157,111 @@
157
157
  でも、実は計算式をなんども回しててリソースを無駄にしてるコードですね。
158
158
 
159
159
  もっとスッキリ書けますね。
160
+
161
+
162
+
163
+
164
+
165
+ 下記にきちんと動くコードを記載しました。
166
+
167
+ imageViewの大きさを先に計算することでリソースもごくわずかに節約してます。
168
+
169
+
170
+
171
+ ```Swift
172
+
173
+ import UIKit
174
+
175
+
176
+
177
+ class ViewController: UIViewController {
178
+
179
+
180
+
181
+ var viewWidth: CGFloat!
182
+
183
+ var viewHeight: CGFloat!
184
+
185
+ // ここの下を変えれば表示変えられる。
186
+
187
+ var imageWidth:CGFloat = 0.0 // 新規追加
188
+
189
+ var imageHeight:CGFloat = 0.0 // 新規追加
190
+
191
+ var n : Int = 0 // 新規追加
192
+
193
+ let verticalSpace:CGFloat = 10.0
194
+
195
+ let horizontalSpace:CGFloat = 30.0
196
+
197
+ var imageNameArray = ["List.png", "menuIcon.png", "server.png", "Settings.png"]
198
+
199
+ let totalRow = 2
200
+
201
+ let totalColum = 2
202
+
203
+
204
+
205
+ override func viewDidLoad() {
206
+
207
+ super.viewDidLoad()
208
+
209
+ self.viewWidth = self.view.frame.size.width
210
+
211
+ self.viewHeight = self.view.frame.size.height
212
+
213
+ self.imageWidth = (self.viewWidth - (CGFloat(totalColum + 1) * horizontalSpace)) / CGFloat(totalColum) // 新規追加
214
+
215
+ self.imageHeight = (self.viewHeight - (CGFloat(totalRow + 1) * verticalSpace)) / CGFloat(totalRow) // 新規追加
216
+
217
+
218
+
219
+ // for文を重ねることで、各行ずつ、列を追加している
220
+
221
+ for i in 0 ... totalRow - 1 {
222
+
223
+ for j in 0 ... totalColum - 1 {
224
+
225
+ makeView(Row: i, Colum: j, imageNo: n) // nに変更
226
+
227
+ n = n + 1
228
+
229
+ }
230
+
231
+ }
232
+
233
+
234
+
235
+ }
236
+
237
+
238
+
239
+ func makeView(Row: Int, Colum: Int, imageNo: Int) {
240
+
241
+ print("makeView[Row]", Row, "[Colum]", Colum, "[imageNo]", imageNo) // 確認用
242
+
243
+ // 画像のファイル名を取り出し、viewにセットする
244
+
245
+ let image:UIImage = UIImage(named: self.imageNameArray[imageNo])!
246
+
247
+ let imageView = UIImageView(image:image)
248
+
249
+ // 画像の位置・大きさを指定する
250
+
251
+ imageView.frame = CGRect(x: horizontalSpace * CGFloat(Colum + 1) + imageWidth * CGFloat(Colum), // 計算し直し
252
+
253
+ y: verticalSpace * CGFloat(Row + 1) + imageHeight * CGFloat(Row), // 計算し直し
254
+
255
+ width: self.imageWidth,
256
+
257
+ height: self.imageHeight)
258
+
259
+ print(n, "番目のimageView.frame=", imageView.frame) // 確認用
260
+
261
+ imageView.tag = Row * 100 + Colum
262
+
263
+ self.view.addSubview(imageView)
264
+
265
+ }
266
+
267
+ ```

3

コード微修正

2019/01/05 07:51

投稿

hameji001
hameji001

スコア639

test CHANGED
@@ -82,9 +82,9 @@
82
82
 
83
83
  // 画像の大きさを設定
84
84
 
85
- let imageWidth:CGFloat = ( viewWidth - (verticalSpace * (Row + 1) ) ) / CGFloat(Row)
85
+ let imageWidth:CGFloat = ( viewWidth - (verticalSpace * CGFloat(Row + 1) ) ) / CGFloat(Row)
86
86
 
87
- let imageHeight:CGFloat = ( viewHeight - (horizontalSpace * (Colum + 1) ) ) / CGFloat(Colum)
87
+ let imageHeight:CGFloat = ( viewHeight - (horizontalSpace * CGFloat(Colum + 1) ) ) / CGFloat(Colum)
88
88
 
89
89
  // 画像の位置・大きさを指定する
90
90
 
@@ -103,8 +103,6 @@
103
103
 
104
104
 
105
105
  ```
106
-
107
-
108
106
 
109
107
 
110
108
 
@@ -153,3 +151,9 @@
153
151
  各imageのサイズが違いそうなので、
154
152
 
155
153
  絵の中心点をセットするコードに変更した方がいいかもしれないですね。
154
+
155
+
156
+
157
+ でも、実は計算式をなんども回しててリソースを無駄にしてるコードですね。
158
+
159
+ もっとスッキリ書けますね。

2

追記2

2019/01/04 14:19

投稿

hameji001
hameji001

スコア639

test CHANGED
@@ -124,7 +124,7 @@
124
124
 
125
125
  何x何でも対応できると思います。
126
126
 
127
- 左右上下の感覚も大きさの数字をいじれば調整できます。
127
+ 左右上下の間隔も大きさの数字をいじれば調整できます。
128
128
 
129
129
 
130
130
 
@@ -145,3 +145,11 @@
145
145
  絵を書いて、2x2や3x3で計算式を立ててみると、理解しやすいと思います。
146
146
 
147
147
  頑張ってください。
148
+
149
+
150
+
151
+ [追伸]
152
+
153
+ 各imageのサイズが違いそうなので、
154
+
155
+ 絵の中心点をセットするコードに変更した方がいいかもしれないですね。

1

追記

2019/01/04 08:48

投稿

hameji001
hameji001

スコア639

test CHANGED
@@ -30,11 +30,11 @@
30
30
 
31
31
  var viewHeight: CGFloat!
32
32
 
33
+ // ここの下を変えれば表示変えられる。
34
+
33
35
  var verticalSpace:CGFloat = 10.0
34
36
 
35
37
  var horizontalSpace:CGFloat = 20.0
36
-
37
- // ここの下を変えれば表示変えられる。
38
38
 
39
39
  var imageNameArray = ["xxxx.jpg", "xxxx.jpg", "xxxx.jpg", "xxxx.jpg"]
40
40
 
@@ -113,3 +113,35 @@
113
113
  上記が理解できたら、それを使って横向きにしたら、
114
114
 
115
115
  変更されるようにコード書いてみるのも勉強になると思います。
116
+
117
+
118
+
119
+ サンプルでは2x2の表示を想定していますが、
120
+
121
+ 計算は定数を使って行なっているので、
122
+
123
+ 初期のグローバル定数、絵のファイル名リストを編集すれば、
124
+
125
+ 何x何でも対応できると思います。
126
+
127
+ 左右上下の感覚も大きさの数字をいじれば調整できます。
128
+
129
+
130
+
131
+ ちなみに比率保存のためにはself.viewの高さが大きい時と、
132
+
133
+ self.viewの横幅が大きい場合に場合分けして、
134
+
135
+ 絵の縦横の大きい辺の計算をまず、空白を引いて、
136
+
137
+ 残った距離を個数で割り、元の絵のサイズで割り最大倍率を計算し、
138
+
139
+ 残りの辺はその倍率を元の幅に対して掛けて計算し、
140
+
141
+ 最後に空白はその絵の幅を抜いたものを等分する式を作ればいいはずです。
142
+
143
+ ちょっと言葉では複雑になりますね。
144
+
145
+ 絵を書いて、2x2や3x3で計算式を立ててみると、理解しやすいと思います。
146
+
147
+ 頑張ってください。