SwiftでUIViewのframe操作を楽にするextension
Objective-Cの時から、UIViewの位置を決める時のframe操作がまどろっこしくてしかたなかった人は多かったんじゃないかと思います。
SwiftのCGRectはそれなりに便利関数が追加されたとは言え、やっぱりまだまだめんどいです。Autolayoutを使ったほうがいい場合もありますが、あれはあれでめんどくさいのでちょちょっとframeで動かしたいこともよくあります。でも、UIView内のframeって中途半端に中身の上書き禁止になっててめんどくさい。
例えばあるUIViewを、別のUIViewの右端に揃えたい時。
someView.right = otherView.rightって書きたいやん。
大きさの違う円を、真ん中合わせて二重丸っぽくしたい時は、
someCircle.center = otherCircle.centerって書きたいやん。
あるUIViewを、10ポイントだけ空けて別のUIViewの隣に置きたい時は、
someView.left = otherView.right + 10って書きたいやん。
という願いを叶えるためのextensionを作ったので置いておきます。めんどくさいからまだsubmoduleにはしてません。気が向いたら。
SPONSERD LINK
1 // UIView+extension.swift
2
3 extension UIView {
4 var x: CGFloat {
5 get {
6 return frame.minX
7 }
8 set {
9 frame = CGRect(newValue, frame.minY, frame.width, frame.height)
10 }
11 }
12
13 var y: CGFloat {
14 get {
15 return frame.minY
16 }
17 set {
18 frame = CGRect(frame.minX, newValue, frame.width, frame.height)
19 }
20 }
21
22 var width: CGFloat {
23 get {
24 return frame.width
25 }
26 set {
27 frame = CGRect(frame.minX, frame.width, newValue, frame.height)
28 }
29 }
30
31 var height: CGFloat {
32 get {
33 return frame.height
34 }
35 set {
36 frame = CGRect(frame.minX, frame.minY, frame.width, newValue)
37 }
38 }
39
40 var top: CGFloat {
41 get {
42 return y
43 }
44 set {
45 y = newValue
46 }
47 }
48
49 var bottom: CGFloat {
50 get {
51 return frame.maxY
52 }
53 set {
54 frame = CGRect(x, newValue - height, width, height)
55 }
56 }
57
58 var left: CGFloat {
59 get {
60 return x
61 }
62 set {
63 x = newValue
64 }
65 }
66
67 var right: CGFloat {
68 get {
69 return frame.maxX
70 }
71 set {
72 frame = CGRect(newValue - width, y, width, height)
73 }
74 }
75
76 var midX: CGFloat {
77 get {
78 return frame.midX
79 }
80 set {
81 frame = CGRect(newValue - width / 2, y, width, height)
82 }
83 }
84
85 var midY: CGFloat {
86 get {
87 return frame.midY
88 }
89 set {
90 frame = CGRect(x, newValue - height / 2, width, height)
91 }
92 }
93
94 var center: CGPoint {
95 get {
96 return CGPoint(frame.midX, frame.midY)
97 }
98 set {
99 frame = CGRect(newValue.x - width / 2, newValue.y - height / 2, width, height)
100 }
101 }
102 }このままやとコンパイルエラーになるので、下記のミニextensionも一緒にどうぞ。こちらは、いちいちx: とかwidth: とかのキーワードを入れなくてもよくするinitializer達です。
1 // CoreGraphics+extension.swift
2
3 extension CGPoint {
4 init(_ x: CGFloat, _ y: CGFloat) {
5 self.x = x
6 self.y = y
7 }
8 }
9
10 extension CGSize {
11 init(_ width: CGFloat, _ height: CGFloat) {
12 self.width = width
13 self.height = height
14 }
15 }
16
17 extension CGRect {
18 init(_ x: CGFloat, _ y: CGFloat, _ width: CGFloat, _ height: CGFloat) {
19 self.origin = CGPoint(x, y)
20 self.size = CGSize(width, height)
21 }
22 }SPONSERD LINK