这是一个示例 View :
我想计算一个带有 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/