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

質問編集履歴

8

訂正

2019/02/12 01:22

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -75,4 +75,73 @@
75
75
 
76
76
  角丸設定その②を使用すると、上側左右が角丸設定になった状態でキャプチャされます。
77
77
 
78
- ![イメージ説明](4ede63f47169f04d06932e05e263014c.png)
78
+ ![イメージ説明](4ede63f47169f04d06932e05e263014c.png)
79
+
80
+
81
+ 訂正前の質問コード
82
+ ```swift
83
+ import UIKit
84
+ class ViewController: UIViewController {
85
+ @IBOutlet weak var targetView: UIView!
86
+
87
+ override func viewDidLoad() {
88
+ super.viewDidLoad()
89
+ // Do any additional setup after loading the view, typically from a nib.
90
+
91
+ let copiedImageView = UIImageView()
92
+ copiedImageView.bounds = targetView.bounds
93
+ copiedImageView.center = self.view.center
94
+
95
+ copiedImageView.image = targetView.captureView()
96
+
97
+ self.view.addSubview(copiedImageView)
98
+
99
+ }
100
+ }
101
+ // 角丸設定
102
+ @IBDesignable
103
+ class UpperCornerRView: UIView {
104
+
105
+ override func draw(_ rect: CGRect) {
106
+ self.clipsToBounds = (cornerRadius > 0)
107
+ if #available(iOS 11.0, *) {
108
+ self.layer.maskedCorners = [.layerMinXMinYCorner, .layerMaxXMinYCorner]
109
+ }
110
+ }
111
+ }
112
+
113
+ extension UIView {
114
+
115
+ @IBInspectable
116
+ var cornerRadius: CGFloat {
117
+ get {
118
+ return layer.cornerRadius
119
+ }
120
+ set {
121
+ layer.cornerRadius = newValue
122
+ }
123
+ }
124
+
125
+ func captureView() -> UIImage{
126
+ // キャプチャする範囲を取得
127
+ let rect = self.bounds
128
+
129
+ // ビットマップ画像のcontextを作成
130
+ UIGraphicsBeginImageContextWithOptions(rect.size, false, 0.0)
131
+ let context: CGContext = UIGraphicsGetCurrentContext()!
132
+
133
+ // 対象のview内の描画をcontextに複写する
134
+ self.layer.render(in: context)
135
+
136
+ // 現在のcontextのビットマップをUIImageとして取得
137
+ let capturedImage : UIImage = UIGraphicsGetImageFromCurrentImageContext()!
138
+
139
+ // contextを閉じる
140
+ UIGraphicsEndImageContext()
141
+
142
+ return capturedImage
143
+ }
144
+
145
+ }
146
+
147
+ ```

7

訂正

2019/02/12 01:22

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -8,14 +8,14 @@
8
8
 
9
9
 
10
10
 
11
- ![イメージ説明](d227ddfb092d8b83675be050f7f9b850.png)
11
+ ![イメージ説明](4277e6db4c6fc3c414c147fadf9c97bb.png)
12
12
 
13
13
  コード
14
14
  ```swift
15
15
  import UIKit
16
16
 
17
17
  class ViewController: UIViewController {
18
-
18
+
19
19
  @IBOutlet weak var targetView: UIView!
20
20
 
21
21
  override func viewDidLoad() {
@@ -24,17 +24,19 @@
24
24
  // ### 角丸設定その① ###
25
25
  // ⇩の方法で角丸にすると四隅が角丸の状態で複製される
26
26
  //targetViewを角丸設定する
27
+ targetView.backgroundColor = UIColor.green
27
28
  targetView.layer.cornerRadius = 15
28
- targetView.layer.maskedCorners = [.layerMinXMaxYCorner, .layerMaxXMaxYCorner]
29
+ targetView.layer.maskedCorners = [.layerMinXMinYCorner, .layerMaxXMinYCorner]
29
30
 
30
31
  // ### 角丸設定その② ###
31
32
  // ⇩の方法で角丸にするときちんと複製される
33
+ //targetView.backgroundColor = UIColor.red
32
- //let path = UIBezierPath(roundedRect:targetView.bounds,
34
+ //let path = UIBezierPath(roundedRect:targetView.bounds,
33
- //byRoundingCorners:[.topLeft, .topRight],
35
+ //byRoundingCorners:[.topLeft, .topRight],
34
- //cornerRadii: CGSize(width: 10, height: 10))
36
+ //cornerRadii: CGSize(width: 10, height: 10))
35
- //let maskLayer = CAShapeLayer()
37
+ //let maskLayer = CAShapeLayer()
36
- //maskLayer.path = path.cgPath
38
+ //maskLayer.path = path.cgPath
37
- //targetView.layer.mask = maskLayer
39
+ //targetView.layer.mask = maskLayer
38
40
 
39
41
 
40
42
 
@@ -65,11 +67,12 @@
65
67
  }
66
68
 
67
69
 
70
+
68
71
  ```
69
72
 
70
73
  storyboard
71
- ![イメージ説明](7b059e097abf802bc444ba2d8e7bb3e9.png)
74
+ ![イメージ説明](eda0519cc8bba4668a565ddfe3b3edb6.png)
72
75
 
73
76
  角丸設定その②を使用すると、上側左右が角丸設定になった状態でキャプチャされます。
74
77
 
75
- ![イメージ説明](33542c0e3b7004db82db6e252a98130f.png)
78
+ ![イメージ説明](4ede63f47169f04d06932e05e263014c.png)

6

訂正

2019/02/12 01:14

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -5,11 +5,11 @@
5
5
  解決方法ご存知でしたら教えてください。
6
6
 
7
7
  上が複製元で、下が複製先になります。
8
- 上のUIViewのクラスをUIViewのサブクラス`UpperCornerRView`にして角丸に設定しています。
9
8
 
10
9
 
11
- ![イメージ説明](cf55898c833ed594c7f71d70cd18a645.png)
12
10
 
11
+ ![イメージ説明](d227ddfb092d8b83675be050f7f9b850.png)
12
+
13
13
  コード
14
14
  ```swift
15
15
  import UIKit
@@ -20,77 +20,56 @@
20
20
 
21
21
  override func viewDidLoad() {
22
22
  super.viewDidLoad()
23
- // Do any additional setup after loading the view, typically from a nib.
24
23
 
24
+ // ### 角丸設定その① ###
25
- let copiedImageView = UIImageView()
25
+ // ⇩の方法で角丸にすると四隅が角丸の状態で複製される
26
- copiedImageView.bounds = targetView.bounds
26
+ //targetViewを角丸設定する
27
- copiedImageView.center = self.view.center
27
+ targetView.layer.cornerRadius = 15
28
+ targetView.layer.maskedCorners = [.layerMinXMaxYCorner, .layerMaxXMaxYCorner]
28
29
 
30
+ // ### 角丸設定その② ###
31
+ // ⇩の方法で角丸にするときちんと複製される
32
+ //let path = UIBezierPath(roundedRect:targetView.bounds,
33
+ //byRoundingCorners:[.topLeft, .topRight],
34
+ //cornerRadii: CGSize(width: 10, height: 10))
29
- copiedImageView.image = targetView.captureView()
35
+ //let maskLayer = CAShapeLayer()
36
+ //maskLayer.path = path.cgPath
37
+ //targetView.layer.mask = maskLayer
30
38
 
31
- self.view.addSubview(copiedImageView)
32
39
 
40
+
33
41
  }
34
- }
35
-
36
- // 角丸設定
37
- @IBDesignable
38
- class UpperCornerRView: UIView {
39
42
 
40
- override func draw(_ rect: CGRect) {
41
- self.clipsToBounds = (cornerRadius > 0)
42
- if #available(iOS 11.0, *) {
43
- self.layer.maskedCorners = [.layerMinXMinYCorner, .layerMaxXMinYCorner]
44
- }
45
- }
46
- }
47
-
48
- extension UIView {
49
-
50
- @IBInspectable
51
- var cornerRadius: CGFloat {
52
- get {
53
- return layer.cornerRadius
54
- }
55
- set {
56
- layer.cornerRadius = newValue
57
- }
58
- }
59
-
60
- func captureView() -> UIImage{
61
- // キャチャする範囲を取得
43
+ // ボタンタッで複製する
62
- let rect = self.bounds
44
+ @IBAction func captureAndPaste(_ sender: UIButton) {
63
45
 
46
+ let copiedImageView = UIImageView()
47
+ copiedImageView.bounds = targetView.bounds
48
+ copiedImageView.center = self.view.center
49
+
64
50
  // ビットマップ画像のcontextを作成
65
- UIGraphicsBeginImageContextWithOptions(rect.size, false, 0.0)
51
+ UIGraphicsBeginImageContextWithOptions(targetView.bounds.size, false, 0.0)
66
52
  let context: CGContext = UIGraphicsGetCurrentContext()!
67
53
 
68
54
  // 対象のview内の描画をcontextに複写する
69
- self.layer.render(in: context)
55
+ targetView.layer.render(in: context) // この辺が問題でしょうか??
70
-
71
56
  // 現在のcontextのビットマップをUIImageとして取得
72
57
  let capturedImage : UIImage = UIGraphicsGetImageFromCurrentImageContext()!
73
-
74
58
  // contextを閉じる
75
59
  UIGraphicsEndImageContext()
76
60
 
77
- return capturedImage
61
+ copiedImageView.image = capturedImage
62
+
63
+ self.view.addSubview(copiedImageView)
78
64
  }
79
-
80
65
  }
81
66
 
82
67
 
83
68
  ```
84
69
 
70
+ storyboard
71
+ ![イメージ説明](7b059e097abf802bc444ba2d8e7bb3e9.png)
85
72
 
73
+ 角丸設定その②を使用すると、上側左右が角丸設定になった状態でキャプチャされます。
86
74
 
87
- ⇩の方法で角丸処理したUIViewはきちんと複製されました。
88
- ```swift
89
- /// iOS11未満の角丸処理
90
- let path = UIBezierPath(roundedRect:targetView.bounds,
75
+ ![イメージ説明](33542c0e3b7004db82db6e252a98130f.png)
91
- byRoundingCorners:[.topLeft, .topRight],
92
- cornerRadii: CGSize(width: 20, height: 20))
93
- let maskLayer = CAShapeLayer()
94
- maskLayer.path = path.cgPath
95
- targetView.layer.mask = maskLayer
96
- ```

5

タイトル訂正

2019/02/12 01:08

投稿

退会済みユーザー
title CHANGED
@@ -1,1 +1,1 @@
1
- maskedCornersプロパティを使って角丸にしたUIViewをコピーすると角丸設定が反映されない…。
1
+ maskedCornersプロパティを使って角丸にしたUIViewをキャプチャ?すると角丸設定が反映されない…。
body CHANGED
File without changes

4

訂正

2019/02/11 23:16

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -8,19 +8,6 @@
8
8
  上のUIViewのクラスをUIViewのサブクラス`UpperCornerRView`にして角丸に設定しています。
9
9
 
10
10
 
11
- ⇩の方法で角丸処理したUIViewはきちんと複製されました。
12
- ```swift
13
- /// iOS11未満の角丸処理
14
- let path = UIBezierPath(roundedRect:targetView.bounds,
15
- byRoundingCorners:[.topLeft, .topRight],
16
- cornerRadii: CGSize(width: 20, height: 20))
17
- let maskLayer = CAShapeLayer()
18
- maskLayer.path = path.cgPath
19
- targetView.layer.mask = maskLayer
20
- ```
21
-
22
-
23
-
24
11
  ![イメージ説明](cf55898c833ed594c7f71d70cd18a645.png)
25
12
 
26
13
  コード
@@ -93,4 +80,17 @@
93
80
  }
94
81
 
95
82
 
83
+ ```
84
+
85
+
86
+
87
+ ⇩の方法で角丸処理したUIViewはきちんと複製されました。
88
+ ```swift
89
+ /// iOS11未満の角丸処理
90
+ let path = UIBezierPath(roundedRect:targetView.bounds,
91
+ byRoundingCorners:[.topLeft, .topRight],
92
+ cornerRadii: CGSize(width: 20, height: 20))
93
+ let maskLayer = CAShapeLayer()
94
+ maskLayer.path = path.cgPath
95
+ targetView.layer.mask = maskLayer
96
96
  ```

3

追記

2019/02/11 20:53

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -8,6 +8,19 @@
8
8
  上のUIViewのクラスをUIViewのサブクラス`UpperCornerRView`にして角丸に設定しています。
9
9
 
10
10
 
11
+ ⇩の方法で角丸処理したUIViewはきちんと複製されました。
12
+ ```swift
13
+ /// iOS11未満の角丸処理
14
+ let path = UIBezierPath(roundedRect:targetView.bounds,
15
+ byRoundingCorners:[.topLeft, .topRight],
16
+ cornerRadii: CGSize(width: 20, height: 20))
17
+ let maskLayer = CAShapeLayer()
18
+ maskLayer.path = path.cgPath
19
+ targetView.layer.mask = maskLayer
20
+ ```
21
+
22
+
23
+
11
24
  ![イメージ説明](cf55898c833ed594c7f71d70cd18a645.png)
12
25
 
13
26
  コード

2

訂正

2019/02/11 20:52

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -5,7 +5,9 @@
5
5
  解決方法ご存知でしたら教えてください。
6
6
 
7
7
  上が複製元で、下が複製先になります。
8
+ 上のUIViewのクラスをUIViewのサブクラス`UpperCornerRView`にして角丸に設定しています。
8
9
 
10
+
9
11
  ![イメージ説明](cf55898c833ed594c7f71d70cd18a645.png)
10
12
 
11
13
  コード
@@ -29,8 +31,20 @@
29
31
  self.view.addSubview(copiedImageView)
30
32
 
31
33
  }
34
+ }
32
35
 
36
+ // 角丸設定
37
+ @IBDesignable
38
+ class UpperCornerRView: UIView {
39
+
40
+ override func draw(_ rect: CGRect) {
41
+ self.clipsToBounds = (cornerRadius > 0)
42
+ if #available(iOS 11.0, *) {
43
+ self.layer.maskedCorners = [.layerMinXMinYCorner, .layerMaxXMinYCorner]
44
+ }
45
+ }
33
46
  }
47
+
34
48
  extension UIView {
35
49
 
36
50
  @IBInspectable
@@ -65,15 +79,5 @@
65
79
 
66
80
  }
67
81
 
68
- @IBDesignable
82
+
69
- class UpperCornerRView: UIView {
70
-
71
- override func draw(_ rect: CGRect) {
72
- self.clipsToBounds = (cornerRadius > 0)
73
- if #available(iOS 11.0, *) {
74
- self.layer.maskedCorners = [.layerMinXMinYCorner, .layerMaxXMinYCorner]
75
- }
76
- }
77
-
78
- }
79
83
  ```

1

訂正

2019/02/11 20:07

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -1,6 +1,6 @@
1
1
  いつもお世話になります。
2
2
 
3
- `maskedCorners`プロパティを使って上側左右を角丸にしたUIViewをコピーして`UIImageView`に貼り付けたところ、
3
+ `maskedCorners`プロパティを使って上側左右を角丸にしたUIViewをキャプチャ?して`UIImageView`に貼り付けたところ、
4
4
  四隅とも角丸になってしまいます。
5
5
  解決方法ご存知でしたら教えてください。
6
6