2012-07-17 21 views
5

Ho un sacco di visualizzazioni nella mia app. Vorrei sistemarli in una forma circolare e cambiare il loro centro in base al numero di visualizzazioni presenti.iOS - Disponi le subview in forma circolare

Quindi, se ci sono 3 viste apparirebbero come un triangolo, ma formerebbero comunque un cerchio. Se ce ne sono 4 sembrerebbe un quadrato ma formerebbe ancora un cerchio, e così via ...

In breve, i centri di tutti i punti di vista si siederebbero su un cerchio immaginario.

Qualche suggerimento?

risposta

13

Questo è il codice che ho usato in uno dei miei progetti, spero che aiuta.

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

Opere grande .. !! – Shailesh

0

È possibile dividere i gradi di un cerchio (360 gradi o 2π radianti) in base al numero di visualizzazioni disponibili, quindi regolare i centri in base all'angolo e alla distanza dal centro.

Ecco alcune funzioni che utilizzo:

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

Ecco una versione Swift 3 della risposta accettata, come estensione UIView con offset di argomenti:

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 
     } 
    } 
}