Использование счетчика в том же методе, что и в arc4random, приводит к тому, что кнопка остается неподвижной. (IOS)

У меня есть кнопка, которую я хочу отображать на экране в случайном порядке при каждом ее нажатии. Я использую 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];


}

1 ответ

Решение

На самом деле проблема заключается не в счетчике, а в настройке значения на вашем ярлыке. Это проблема с автоматическим макетом, и когда вы устанавливаете значение метки, это вызывает компоновку видов, а функция автоматического макета перемещает кнопку обратно в исходное положение. Самое простое решение - отключить автоматическую разметку, которая выполняется с помощью Инспектора файлов (самый дальний слева) в 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];
}
Другие вопросы по тегам