私のアプリにはたくさんのビューがあります。円形に配置し、ビューの数に応じて中心を変更したいと思います。
したがって、3つのビューがある場合、それらは三角形のように見えますが、それでも円を形成します。4つある場合、正方形のように見えますが、それでも円を形成します。
つまり、すべてのビューの中心は架空の円上にあります。
助言がありますか?
私のアプリにはたくさんのビューがあります。円形に配置し、ビューの数に応じて中心を変更したいと思います。
したがって、3つのビューがある場合、それらは三角形のように見えますが、それでも円を形成します。4つある場合、正方形のように見えますが、それでも円を形成します。
つまり、すべてのビューの中心は架空の円上にあります。
助言がありますか?
これは私のプロジェクトの1つで使用したコードです。お役に立てば幸いです。
// you must set both of these
CGPoint centerOfCircle;
float radius;
int count = 0;
float angleStep = 2.0f * M_PI / [arrayOfViews count];
for (UIView *view in arrayOfViews) {
float xPos = cosf(angleStep * count) * radius;
float yPos = sinf(angleStep * count) * radius;
view.center = CGPointMake(centerOfCircle.x + xPos, centerOfCircle.y +yPos);
count++;
}
オフセット引数を持つUIView拡張機能として、受け入れられた回答のSwift3バージョンを次に示します。
public extension UIView {
public func distributeSubviewsInACircle(xOffset: CGFloat, yOffset: CGFloat) {
let center = CGPoint(x: self.bounds.size.width / 2, y: self.bounds.size.height / 2)
let radius: CGFloat = self.bounds.size.width / 2
let angleStep: CGFloat = 2 * CGFloat(Double.pi) / CGFloat(self.subviews.count)
var count = 0
for subview in self.subviews {
let xPos = center.x + CGFloat(cosf(Float(angleStep) * Float(count))) * (radius - xOffset)
let yPos = center.y + CGFloat(sinf(Float(angleStep) * Float(count))) * (radius - yOffset)
subview.center = CGPoint(x: xPos, y: yPos)
count += 1
}
}
}
円の角度(360度または2πラジアン)をビューの数で割ってから、角度と中心からの距離に基づいて中心を調整できます。
私が使用するいくつかの関数は次のとおりです。
// These calculate the x and y offset from the center by using the angle in radians
#define LengthDir_X(__Length__,__Direction__) (cos(__Direction__)*__Length__)
#define LengthDir_Y(__Length__,__Direction__) (sin(__Direction__)*__Length__)
// I use this to convert degrees to radians and back if I have to
#define DegToRad(__ANGLE__) (((__ANGLE__) * 2.0 * M_PI) / 360.0)
#define RadToDeg(__ANGLE__) (((__ANGLE__) * 360) / (2.0 * M_PI))