ios - 如何计算不接触 UIView 的随机 CGPoint

标签 ios swift math uiview

这是一个示例 View :

enter image description here

我想计算一个带有 CGPoint 的帧,我可以在其中生成另一张卡片 (UIView) 而无需触及任何现有卡片。当然它是可选的,因为 View 可以充满卡片,因此没有空闲位置。

这就是我如何在屏幕上看到任何卡片以及我现在的功能:

func freeSpotCalculator() -> CGPoint?{
    var takenSpots = [CGPoint]()
    for card in playableCards{
        takenSpots.append(card.center)
    }

}

我不知道从哪里开始以及如何计算屏幕上的随机 CGPoint。随机帧与屏幕上的卡片具有相同的宽度高度

最佳答案

这种天真的方法非常简单,但一旦屏幕填满就会出现问题。生成一个 x 坐标介于 0 和屏幕宽度之间,y 坐标介于 0 和屏幕高度之间的随机 CGPoint。检查以该点为中心的矩形是否与任何现有 View 相交。如果不是,则您有随机位置。

当屏幕开始填满时就会出现问题。那时你可能会尝试很多随机点,然后才能找到放置卡片的地方。您也可能会遇到无法容纳更多卡片的情况。你怎么知道你已经达到了?生成随机点的循环会一直运行下去吗?

更聪明的解决方案是跟踪屏幕上的空闲空间。始终在这些可用空间内大致生成随机点。如果近似值足够接近,您可以使用网格来执行此操作。是否有一张卡片占据每个网格位置?然后,当最大的可用空间小于卡片矩形的大小时,您就知道自己完成了。这比简单的方法要多得多,但当屏幕开始填满时速度更快,而且您会确定何时完成。

如果您知道自己的屏幕空间总是多于卡片可能占用的空间,那么天真的方法就可以了。

关于ios - 如何计算不接触 UIView 的随机 CGPoint,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45593466/

相关文章:

javascript - 如何进行舍入误差最小的百分比分布

ios - SOAP XML 中的问题

ios - 如何关闭视频播放时出现的弹窗?

iphone - Obj-C,在 NSObject 类的类型对象上找不到属性 'navigationController'?

ios - 在 Playground 中加载和注册 CGFonts

c++ - 逆向工程 - 这是一个便宜的 3D 距离函数吗?

ios - 错误是 : variables currently must have an initial value when entered at the top level of the REPL

ios - 日期选择器在 swift 2.2 中首次单击文本字段时无法打开

ios - UITextView 文本指示器在错误的位置

java - 如何测试 java.lang.Math 方法是否已被调用?