teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

4

大幅修正

2019/01/05 07:51

投稿

hameji001
hameji001

スコア639

answer CHANGED
@@ -77,4 +77,58 @@
77
77
  絵の中心点をセットするコードに変更した方がいいかもしれないですね。
78
78
 
79
79
  でも、実は計算式をなんども回しててリソースを無駄にしてるコードですね。
80
- もっとスッキリ書けますね。
80
+ もっとスッキリ書けますね。
81
+
82
+
83
+ 下記にきちんと動くコードを記載しました。
84
+ imageViewの大きさを先に計算することでリソースもごくわずかに節約してます。
85
+
86
+ ```Swift
87
+ import UIKit
88
+
89
+ class ViewController: UIViewController {
90
+
91
+ var viewWidth: CGFloat!
92
+ var viewHeight: CGFloat!
93
+ // ここの下を変えれば表示変えられる。
94
+ var imageWidth:CGFloat = 0.0 // 新規追加
95
+ var imageHeight:CGFloat = 0.0 // 新規追加
96
+ var n : Int = 0 // 新規追加
97
+ let verticalSpace:CGFloat = 10.0
98
+ let horizontalSpace:CGFloat = 30.0
99
+ var imageNameArray = ["List.png", "menuIcon.png", "server.png", "Settings.png"]
100
+ let totalRow = 2
101
+ let totalColum = 2
102
+
103
+ override func viewDidLoad() {
104
+ super.viewDidLoad()
105
+ self.viewWidth = self.view.frame.size.width
106
+ self.viewHeight = self.view.frame.size.height
107
+ self.imageWidth = (self.viewWidth - (CGFloat(totalColum + 1) * horizontalSpace)) / CGFloat(totalColum) // 新規追加
108
+ self.imageHeight = (self.viewHeight - (CGFloat(totalRow + 1) * verticalSpace)) / CGFloat(totalRow) // 新規追加
109
+
110
+ // for文を重ねることで、各行ずつ、列を追加している
111
+ for i in 0 ... totalRow - 1 {
112
+ for j in 0 ... totalColum - 1 {
113
+ makeView(Row: i, Colum: j, imageNo: n) // nに変更
114
+ n = n + 1
115
+ }
116
+ }
117
+
118
+ }
119
+
120
+ func makeView(Row: Int, Colum: Int, imageNo: Int) {
121
+ print("makeView[Row]", Row, "[Colum]", Colum, "[imageNo]", imageNo) // 確認用
122
+ // 画像のファイル名を取り出し、viewにセットする
123
+ let image:UIImage = UIImage(named: self.imageNameArray[imageNo])!
124
+ let imageView = UIImageView(image:image)
125
+ // 画像の位置・大きさを指定する
126
+ imageView.frame = CGRect(x: horizontalSpace * CGFloat(Colum + 1) + imageWidth * CGFloat(Colum), // 計算し直し
127
+ y: verticalSpace * CGFloat(Row + 1) + imageHeight * CGFloat(Row), // 計算し直し
128
+ width: self.imageWidth,
129
+ height: self.imageHeight)
130
+ print(n, "番目のimageView.frame=", imageView.frame) // 確認用
131
+ imageView.tag = Row * 100 + Colum
132
+ self.view.addSubview(imageView)
133
+ }
134
+ ```

3

コード微修正

2019/01/05 07:51

投稿

hameji001
hameji001

スコア639

answer CHANGED
@@ -40,8 +40,8 @@
40
40
  let image:UIImage = UIImage(named: self.imageNameArray[imageNo])!
41
41
  let imageView = UIImageView(image:image)
42
42
  // 画像の大きさを設定
43
- let imageWidth:CGFloat = ( viewWidth - (verticalSpace * (Row + 1) ) ) / CGFloat(Row)
43
+ let imageWidth:CGFloat = ( viewWidth - (verticalSpace * CGFloat(Row + 1) ) ) / CGFloat(Row)
44
- let imageHeight:CGFloat = ( viewHeight - (horizontalSpace * (Colum + 1) ) ) / CGFloat(Colum)
44
+ let imageHeight:CGFloat = ( viewHeight - (horizontalSpace * CGFloat(Colum + 1) ) ) / CGFloat(Colum)
45
45
  // 画像の位置・大きさを指定する
46
46
  imageView.frame = CGRect(x: horizontalSpace + (CGFloat(Colum - 1) * imageWidth),
47
47
  y: verticalSpace + (CGFloat(Row - 1) * imageHeight),
@@ -52,7 +52,6 @@
52
52
 
53
53
  ```
54
54
 
55
-
56
55
  あとは、iPhoneが横向きになった時のことを考え、viewにtagをつけておきました。
57
56
  上記が理解できたら、それを使って横向きにしたら、
58
57
  変更されるようにコード書いてみるのも勉強になると思います。
@@ -75,4 +74,7 @@
75
74
 
76
75
  [追伸]
77
76
  各imageのサイズが違いそうなので、
78
- 絵の中心点をセットするコードに変更した方がいいかもしれないですね。
77
+ 絵の中心点をセットするコードに変更した方がいいかもしれないですね。
78
+
79
+ でも、実は計算式をなんども回しててリソースを無駄にしてるコードですね。
80
+ もっとスッキリ書けますね。

2

追記2

2019/01/04 14:19

投稿

hameji001
hameji001

スコア639

answer CHANGED
@@ -61,7 +61,7 @@
61
61
  計算は定数を使って行なっているので、
62
62
  初期のグローバル定数、絵のファイル名リストを編集すれば、
63
63
  何x何でも対応できると思います。
64
- 左右上下の感覚も大きさの数字をいじれば調整できます。
64
+ 左右上下の間隔も大きさの数字をいじれば調整できます。
65
65
 
66
66
  ちなみに比率保存のためにはself.viewの高さが大きい時と、
67
67
  self.viewの横幅が大きい場合に場合分けして、
@@ -71,4 +71,8 @@
71
71
  最後に空白はその絵の幅を抜いたものを等分する式を作ればいいはずです。
72
72
  ちょっと言葉では複雑になりますね。
73
73
  絵を書いて、2x2や3x3で計算式を立ててみると、理解しやすいと思います。
74
- 頑張ってください。
74
+ 頑張ってください。
75
+
76
+ [追伸]
77
+ 各imageのサイズが違いそうなので、
78
+ 絵の中心点をセットするコードに変更した方がいいかもしれないですね。

1

追記

2019/01/04 08:48

投稿

hameji001
hameji001

スコア639

answer CHANGED
@@ -14,9 +14,9 @@
14
14
 
15
15
  var viewWidth: CGFloat!
16
16
  var viewHeight: CGFloat!
17
+ // ここの下を変えれば表示変えられる。
17
18
  var verticalSpace:CGFloat = 10.0
18
19
  var horizontalSpace:CGFloat = 20.0
19
- // ここの下を変えれば表示変えられる。
20
20
  var imageNameArray = ["xxxx.jpg", "xxxx.jpg", "xxxx.jpg", "xxxx.jpg"]
21
21
  let totalRow = 2
22
22
  let totalColum = 2
@@ -55,4 +55,20 @@
55
55
 
56
56
  あとは、iPhoneが横向きになった時のことを考え、viewにtagをつけておきました。
57
57
  上記が理解できたら、それを使って横向きにしたら、
58
- 変更されるようにコード書いてみるのも勉強になると思います。
58
+ 変更されるようにコード書いてみるのも勉強になると思います。
59
+
60
+ サンプルでは2x2の表示を想定していますが、
61
+ 計算は定数を使って行なっているので、
62
+ 初期のグローバル定数、絵のファイル名リストを編集すれば、
63
+ 何x何でも対応できると思います。
64
+ 左右上下の感覚も大きさの数字をいじれば調整できます。
65
+
66
+ ちなみに比率保存のためにはself.viewの高さが大きい時と、
67
+ self.viewの横幅が大きい場合に場合分けして、
68
+ 絵の縦横の大きい辺の計算をまず、空白を引いて、
69
+ 残った距離を個数で割り、元の絵のサイズで割り最大倍率を計算し、
70
+ 残りの辺はその倍率を元の幅に対して掛けて計算し、
71
+ 最後に空白はその絵の幅を抜いたものを等分する式を作ればいいはずです。
72
+ ちょっと言葉では複雑になりますね。
73
+ 絵を書いて、2x2や3x3で計算式を立ててみると、理解しやすいと思います。
74
+ 頑張ってください。