2012-07-17 29 views
5

Tôi có một số lượt xem trong ứng dụng của mình. Tôi muốn sắp xếp chúng theo hình tròn và thay đổi trung tâm của chúng tùy thuộc vào số lượt xem hiện tại.iOS - Sắp xếp các bản xem dưới dạng hình tròn

Vì vậy, nếu có 3 chế độ xem chúng trông giống như hình tam giác, nhưng vẫn sẽ tạo thành một vòng tròn. Nếu có 4 nó sẽ trông giống như một hình vuông nhưng vẫn tạo thành một vòng tròn, và như vậy ...

Tóm lại, các trung tâm của tất cả các khung nhìn sẽ nằm trên một vòng tròn tưởng tượng.

Mọi đề xuất?

Trả lời

13

Đây là mã tôi đã sử dụng một trong các dự án của tôi, hy vọng nó sẽ giúp.

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

Các công trình lớn .. !! – Shailesh

0

Bạn có thể chia độ của vòng tròn (360 độ hoặc 2π radian) theo số lượt xem, sau đó điều chỉnh các tâm của chúng dựa trên góc và khoảng cách từ tâm.

Dưới đây là một số chức năng tôi sử dụng:

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

Dưới đây là một phiên bản Swift 3 của câu trả lời được chấp nhận, như một phần mở rộng UIView với bù đắp đối số:

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 
     } 
    } 
} 
Các vấn đề liên quan