针对不同的屏幕尺寸缩放 arc4random

Scaling arc4random for different screen sizes

我正在制作一个不使用自动布局的游戏,并且使用约束来缩放所有内容并且它运行良好。但是我似乎无法弄清楚这一点,我正在使用 arc4random 在 4.7 英寸屏幕上随机定位 UIButton 的 X 和 Y 坐标。当我在较小的屏幕上尝试 运行 它时,它有时会将 UIButton 绘制出屏幕。如何根据屏幕尺寸上下缩放 arc4random。

-(void)position{

     Randompositionx = arc4random() %270;
     Randompositionx = Randompositionx + 51;
     Randompositiony = arc4random() %411;
     Randompositiony = Randompositiony +163;

UIButton.center = CGPointMake(Randompositionx, Randompositiony);


}

试试这个

-(void)position{
   CGRect frame = [self.view frame];

 Randompositionx = arc4random() %270;
 Randompositionx = Randompositionx + CGRectGetMinX(frame);
 Randompositiony = arc4random() %411;
 Randompositiony = Randompositiony +CGRectGetMinY(frame);

   UIButton.center = CGPointMake(Randompositionx, Randompositiony);


}

现在您可以在您的视图中放置 UIButton。

您应该使用 arc4random_uniform 而不是 arc4random 和模运算符。它给出没有 "modulo bias".

的数字

您需要根据屏幕尺寸调整随机数的上限值。 T_77 的回答是朝着正确的方向迈出了一步,但仍然不正确。

下面的代码假定您要移动的按钮名为 myButton。

它使用 20 左右的边距值。根据需要更改值。

编辑:我将其更新为在位置计算中使用按钮的高度和宽度。使用更新后的代码,即使按钮大小发生变化,按钮也不应该比边距值更靠近任何边缘。也没有神奇的数字。它应该适应它的超级视图的大小。

-(void)position
{
  CGRect frame = myButton.superview.bounds;
  CGFloat leftMargin = 20; //use whatever values you want for magins
  CGFloat rightMargin = 20;
  CGFloat topMargin = 20;
  CGFloat bottomMargin = 20;
  CGFloat randomX, randomY;
  CGFloat xMax = frame.size.width-leftMargin-rightMargin-
    button.bounds.size.width/2;
  randomX = arc4random_uniform(xMax) + leftMargin;
  CGFloat yMax = frame.size.height-topMargin-bottomMargin-
    button.bounds.size.height/2;
  randomY = arc4random_uniform(yMax) + topMargin; 
  myButton.center = CGPointMake(randomX, randomY);
}

另请注意,如果您使用自动布局,则不应直接移动按钮的位置,而应具有位置约束并修改其常量,然后调用 layoutIfNeeded。否则,导致您的布局发生变化的第一件事将导致您的按钮恢复到之前的位置。