Использование счетчика в том же методе, что и в 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];
}