回答編集履歴

1

追記

2020/06/07 12:15

投稿

tsuki01
tsuki01

スコア1751

test CHANGED
@@ -99,3 +99,199 @@
99
99
  }
100
100
 
101
101
  ```
102
+
103
+
104
+
105
+ ---
106
+
107
+
108
+
109
+ ### 2020.06.07追記
110
+
111
+ 保存時のサイズ変更(ImageViewの余白部分削除)に関して追記いたします。
112
+
113
+
114
+
115
+ 以下の参考サイトの方法は使えませんでしょうか。
116
+
117
+ **※どちらも表示時から余白を削除するものなので”保存時”とは異なります。
118
+
119
+ また、トリミング時に多少の誤差(数px)が生じるかもしれません。
120
+
121
+ もし問題あれば、別質問とした方が良い回答が得られるかもしれません(お役に立てず申し訳ありませんが。。)**
122
+
123
+ - [How to find an aspect fit image’s size inside an image view](https://www.hackingwithswift.com/example-code/uikit/how-to-find-an-aspect-fit-images-size-inside-an-image-view)
124
+
125
+ - [UIImageViewを、カメラロールから取得した画像のアスペクト比の形にしたい](https://teratail.com/questions/169060)
126
+
127
+
128
+
129
+ **以下サンプルです(上記で1つめに挙げた参考サイトの方法を利用)**
130
+
131
+ ポイントとしては、「extentionの追加」と「self.imageView.frame = self.imageView.contentClippingRect」の部分となります。
132
+
133
+
134
+
135
+ ```Swift
136
+
137
+ import UIKit
138
+
139
+
140
+
141
+ class ViewController: UIViewController {
142
+
143
+
144
+
145
+ @IBOutlet weak var imageView: UIImageView! // 合成対象のImageView
146
+
147
+ @IBOutlet weak var lbl: UILabel! // 合成対象のLabel
148
+
149
+ @IBOutlet weak var resultImageView: UIImageView!// 合成結果表示用のImageView
150
+
151
+
152
+
153
+
154
+
155
+ override func viewDidLoad() {
156
+
157
+ super.viewDidLoad()
158
+
159
+
160
+
161
+ // LabelをImageView上に追加する
162
+
163
+ imageView.addSubview(lbl)
164
+
165
+
166
+
167
+ // 結果表示用ImageViewの枠線設定
168
+
169
+ resultImageView.layer.borderWidth = 2
170
+
171
+ resultImageView.layer.borderColor = UIColor.red.cgColor
172
+
173
+ }
174
+
175
+
176
+
177
+
178
+
179
+ override func viewDidAppear(_ animated: Bool) {
180
+
181
+ super.viewDidAppear(animated)
182
+
183
+
184
+
185
+ // ImageViewから余白削除
186
+
187
+ self.imageView.frame = self.imageView.contentClippingRect
188
+
189
+
190
+
191
+ // ImageViewとLabelを合成し、結果表示用のImageViewにImage設定
192
+
193
+ self.resultImageView.image = self.takeScreenShot()
194
+
195
+ }
196
+
197
+
198
+
199
+ // Viewの合成処理(キャプチャ取得処理)
200
+
201
+ private func takeScreenShot() -> UIImage {
202
+
203
+
204
+
205
+ // コンテキスト開始
206
+
207
+ UIGraphicsBeginImageContextWithOptions(self.imageView.bounds.size, false, 0.0)
208
+
209
+
210
+
211
+ // ImageView(ImageView上のView含む)を書き出す
212
+
213
+ self.imageView.drawHierarchy(in: self.imageView.bounds, afterScreenUpdates: true)
214
+
215
+
216
+
217
+ // newImageに、コンテキストの内容を書き出す
218
+
219
+ let newImage: UIImage = UIGraphicsGetImageFromCurrentImageContext()!
220
+
221
+
222
+
223
+ // コンテキストを閉じる
224
+
225
+ UIGraphicsEndImageContext()
226
+
227
+
228
+
229
+ // Imageを返却
230
+
231
+ return newImage
232
+
233
+ }
234
+
235
+ }
236
+
237
+
238
+
239
+ // 参考サイトのextension定義
240
+
241
+ extension UIImageView {
242
+
243
+ var contentClippingRect: CGRect {
244
+
245
+ guard let image = image else { return bounds }
246
+
247
+ guard contentMode == .scaleAspectFit else { return bounds }
248
+
249
+ guard image.size.width > 0 && image.size.height > 0 else { return bounds }
250
+
251
+
252
+
253
+ let scale: CGFloat
254
+
255
+ if image.size.width > image.size.height {
256
+
257
+ scale = bounds.width / image.size.width
258
+
259
+ } else {
260
+
261
+ scale = bounds.height / image.size.height
262
+
263
+ }
264
+
265
+
266
+
267
+ let size = CGSize(width: image.size.width * scale, height: image.size.height * scale)
268
+
269
+ let x = (bounds.width - size.width) / 2.0
270
+
271
+ let y = (bounds.height - size.height) / 2.0
272
+
273
+
274
+
275
+ return CGRect(x: x, y: y, width: size.width, height: size.height)
276
+
277
+ }
278
+
279
+ }
280
+
281
+
282
+
283
+ ```
284
+
285
+
286
+
287
+
288
+
289
+ **余白削除前(分かりやすい様に、ImageViewの背景を青色に設定)**
290
+
291
+ ![Before](4a5eefa34cb9613b3651e531973e8513.png)
292
+
293
+
294
+
295
+ **余白削除後**
296
+
297
+ ![After](247721f69ad45b3e85067f4b7f3f058f.png)