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 }