使用与 arc4random 相同的计数器会导致按钮保持静止.(苹果)



我有一个按钮,我想在每次按下时随机显示在屏幕上。我正在使用 arc4random 来实现这一点。但是一旦我将计数器合并到此方法中,随机部分就会停止工作。任何想法将不胜感激,为什么会发生这种情况或如何解决它,提前感谢!我的代码如下。

-(IBAction)random:(id)sender{
    int xValue = arc4random() % 320;
    int yValue = arc4random() % 480;
    button.center = CGPointMake(xValue, yValue);
    counter = counter + 1;
    score.text = [NSString stringWithFormat:@"Score: %i", counter];

}
实际上,揭示

问题的不是计数器,而是标签中值的设置。这是自动布局的问题,当您设置标签的值时,它会强制布局视图,并且自动布局功能会将按钮移回其原始位置。最简单的解决方法是关闭自动布局,这是从IB中的文件检查器(最左边的一个)完成的 - 只需取消选中"使用自动布局"框即可。

它发生得太快了,无法看到发生了什么,但是如果您将代码更改为此代码(自动布局仍处于打开状态),您将看到按钮移动,然后跳回:

-(IBAction)random:(id)sender{
    int xValue = arc4random() % 320;
    int yValue = arc4random() % 480;
    button.center = CGPointMake(xValue, yValue);
    counter = counter + 1;
    [self performSelector:@selector(fillLabel) withObject:nil afterDelay:.5];
}
-(void)fillLabel {
    score.text = [NSString stringWithFormat:@"Score: %i", counter];
}

如果要使用布局约束,另一种方法是更改布局约束的"常量"参数。在下面的示例中,我将按钮放在这样一个位置(在 IB 中),使其对超级视图具有左和上约束。我让IBOutlets与这些约束联系起来,并将它们连接起来。这是代码:

@implementation ViewController {
    IBOutlet UILabel *score;
    int counter;
    NSLayoutConstraint IBOutlet *leftCon;
    NSLayoutConstraint IBOutlet *topCon;
}
-(IBAction)random:(id)sender{
    int xValue = arc4random() % 300;
    int yValue = arc4random() % 440;
    leftCon.constant = xValue;
    topCon.constant = yValue;
    counter = counter + 1;
    score.text = [NSString stringWithFormat:@"Score: %i", counter];
}

相关内容

  • 没有找到相关文章

最新更新