如何将对象放置在中心图像周围的数组中?

时间:2015-12-12 23:52:48

标签: ios swift layout

我有一系列按钮,当我将它们附加到视图时,我希望将它放置在中心的图像视图周围。根据数组中有多少个对象,我希望它们围绕整个圆均匀分布。以下是我尝试这样做的方法。我做错了什么,应该如何解决?驼鹿后面有一个以上的按钮。

enter image description here

var userbutton = [UIButton]()
var upimage = [UIImage]()
var locationpic = [AnyObject]()

 func locationsSet(){

    for (index, users) in upimage.enumerate() {

        let userbutton = UIButton()
        userbutton.addTarget(self, action: "buttonAction:", forControlEvents: .TouchUpInside)
        userbutton.frame = CGRectMake(100, 100, 50, 50)
        userbutton.layer.cornerRadius = userbutton.frame.size.width/2
        userbutton.clipsToBounds = true
        userbutton.setImage(users, forState: .Normal)

        let radians = CGFloat(M_PI) * 2.0 / CGFloat(upimage.count) * CGFloat(index)

        let centerx = self.view.bounds.width / 2.0
        let radius =  currentuserpic.frame.size.width / 2.0
        let centery = self.view.bounds.height / 2.0

        let pointx = centerx + cos(radians) * (radius + 40)
        let pointy = (centery) + (sin(radians)) * (radius + 40)

        userbutton.center.x = pointx
        userbutton.center.y = pointy

        self.userbutton.append(userbutton)
        self.view.addSubview(userbutton)

        print("x\(pointx)")
        print("y\(pointy)")


    }


}

2 个答案:

答案 0 :(得分:2)

整圆是2 * pi弧度。您需要将其除以您拥有的项目数,并将其乘以您当前正在处理的项目的索引。使用trig查找圆圈上的位置:

@directive

答案 1 :(得分:2)

我将如何做到这一点:

创建UIView的扩展以获取对角线和半径。这些都很方便,因为即使“行星”不是正方形,我们也希望我们的“卫星”具有可预测的位置。

extension UIView {

    var diagonal : CGFloat {
        return sqrt(pow(self.frame.width, 2) + pow(self.frame.height, 2))
    }

    var radius : CGFloat {
        return diagonal / 2
    }
}

这将返回基于角度和距原点的距离的点。 它使用了可怕的三角函数。

func getPoint(fromPoint point: CGPoint, atDistance distance: CGFloat, withAngleRadians angle:CGFloat) -> CGPoint {

    let x = point.x
    let y = point.y

    let dx = (distance * cos(angle))
    let dy = (distance * sin(angle))

    return CGPoint(x: (dx + x), y: (dy + y))
}

现在真正的功能。以圆圈模式生成一堆点。我使用了角度的运行总和,而不是每次乘以索引。这只返回视图的中心点。

func encirclePoint(point : CGPoint, distance:CGFloat, inParts parts: Int) -> [CGPoint] {

    let angle = 2 * CGFloat(M_PI) / CGFloat(parts) // critical part, you need radians for trigonometry
    var runningAngle : CGFloat = -(CGFloat(M_PI) / 2) // start at the top

    var points : [CGPoint] = []

    for _ in 0..<parts {
        let circlePoint = getPoint(fromPoint: point, atDistance: distance, withAngleRadians: runningAngle)
        points.append(circlePoint)
        runningAngle += angle
    }

    return points
}

现在您可以创建一个简单的函数,它可以获取视图,边距和一组“卫星”视图。它将设置它们的中心并将它们添加到我们用来输入的视图的超视图中。将它们添加到视图本身是有道理的,因为它们可能不会放在它内部。

func encircleView(view : UIView, withSubViews subViews : [UIView], withMargin margin : CGFloat) {

    guard !(subViews.isEmpty) else { // if there are no subviews : abort
        return
    }

    let distance = view.radius + margin
    let points = encirclePoint(view.center, distance: distance, inParts: subViews.count)

    guard subViews.count == points.count, let uberView = view.superview else { // if the count is not the same or there is no superview: abort
        return
    }

    for (point, subView) in zip(points, subViews) { subView.center = point }
}

注意除了这些函数中的中心计算外我什么也没做。设置它们的另一个功能。这使得维护和调试变得非常容易。

我甚至可以让最后一个函数返回带有更新帧的子视图,然后再添加它们。

enter image description here

或负边际:)

enter image description here

Gist