Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/96.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何围绕中心图像放置阵列中的对象?_Ios_Swift_Layout - Fatal编程技术网

Ios 如何围绕中心图像放置阵列中的对象?

Ios 如何围绕中心图像放置阵列中的对象?,ios,swift,layout,Ios,Swift,Layout,我有一系列的按钮,当我把它们附加到一个视图中时,我想把它们放在中间的图像视图周围。根据阵列中有多少对象,我希望它们在整个圆上均匀分布。下面是我的尝试。我做错了什么?我应该如何修复它?驼鹿后面有不止一个按钮 一个完整的圆是2*pi弧度。您需要将其除以您拥有的项目数,然后乘以当前正在处理的项目的索引。使用trig查找圆上的位置: for (index, users) in upimage.enumerate() { let radians = CGFloat(M_PI) * 2.0 / C

我有一系列的按钮,当我把它们附加到一个视图中时,我想把它们放在中间的图像视图周围。根据阵列中有多少对象,我希望它们在整个圆上均匀分布。下面是我的尝试。我做错了什么?我应该如何修复它?驼鹿后面有不止一个按钮


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

for (index, users) in upimage.enumerate() {
    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
    let pointy = centery + sin(radians) * radius

    ......
}

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

for (index, users) in upimage.enumerate() {
    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
    let pointy = centery + sin(radians) * radius

    ......
}
我将如何做到这一点:

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

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

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



或负边际:)

我将如何做到这一点:

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

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

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



或负边际:)


这不是来自教程。这不是家庭作业。这是我自己的个人应用程序。我被卡住了。我不是要求你编写代码,我只是想知道如何根据数组中的对象数量将数组中的按钮定位到某个位置。这不是教程。这不是家庭作业。这是我自己的个人应用程序。我被卡住了。我不是要求你写代码,我只是想知道如何根据数组中的对象数量将数组中的按钮定位到某个位置。我加入了一些
CGFloat
s,包括@RMenke建议的一个(谢谢!)在计算
弧度时
。看一看,当你从2个用户移动到3个用户时,你只是添加了更多的子视图,而没有清除以前的子视图。您可以保留一个活动子视图数组,并在需要删除它们时对其调用
removeFromSuperview
。添加新用户按钮之前,请使用userButton{button.removeFromSuperview()}中的
for button清除旧按钮;userButton=[]
我在您发布的png中没有看到任何错误。这段代码应该是你在
func locationsSet(){
中做的第一件事。谢谢,但由于某些原因,按钮的间隔不是均匀的puu.sh/lTA5Y/da2ce9d364.png。我加入了一些
CGFloat
s,包括@RMenke建议的(谢谢!)在计算
弧度时
。请看一看。当您从2个用户移动到3个用户时,看起来您只是添加了更多的子视图,而没有清除以前的子视图。您可以保留一个活动子视图数组,并在需要删除它们时调用
removeFromSuperview
。在添加新用户按钮之前,请清除在userButton{button.removeFromSuperview()};userButton=[]我在你发布的png中没有看到任何错误。这段代码应该是你在
func LocationSet(){
中做的第一件事。这很有效,谢谢,但由于某些原因,按钮的间距不是均匀的。