2012-07-17 10 views
5

Mam kilka widoków w mojej aplikacji. Chciałbym ustawić je w kształcie koła i zmienić ich środek w zależności od liczby obecnych widoków.iOS - Ułóż subviews w okrągłym kształcie

Tak więc, jeśli są 3 widoki, wyglądałyby jak trójkąt, ale nadal tworzą krąg. Jeśli są 4, to wyglądałoby jak kwadrat, ale nadal tworzy koło, i tak dalej ...

W skrócie, centra wszystkich poglądów zasiadłyby w wyimaginowanym kręgu.

Wszelkie sugestie?

Odpowiedz

13

Jest to kod Kiedyś w jednym z moich projektów, mam nadzieję, że to pomaga.

// 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++; 
} 
+0

Działa świetnie .. !! – Shailesh

0

Możesz podzielić stopnie koła (360 stopni lub 2π radianów) przez liczbę posiadanych widoków, a następnie dopasować ich centra w oparciu o kąt i odległość od środka.

Oto niektóre funkcje używam:

// 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)) 
0

Oto Swift 3 wersji zaakceptowanej odpowiedzi, jako przedłużenie UIView z offsetu argumenty:

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 
     } 
    } 
} 
Powiązane problemy