Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/98.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 使用计时器将UIbutton移动到随机位置_Ios_Objective C_Timer_Uibutton - Fatal编程技术网

Ios 使用计时器将UIbutton移动到随机位置

Ios 使用计时器将UIbutton移动到随机位置,ios,objective-c,timer,uibutton,Ios,Objective C,Timer,Uibutton,我正在Objective C中制作一个简单的应用程序,每次单击按钮时,按钮都会改变屏幕上的位置。第一次单击按钮时,计时器开始计时 问题是,计时器每下降一秒,按钮就会返回其原始位置。如何使计时器不影响按钮移动 以下是我的ViewController.m文件中的代码: 注意:我完全搞不懂这一点。我可能需要有人给我解释清楚,告诉我该怎么做。谢谢 注意:我的UIButton是“黑点” -(iAction)主单击按钮{ intxmin=([blackDot frame].size.width)/2; in

我正在Objective C中制作一个简单的应用程序,每次单击按钮时,按钮都会改变屏幕上的位置。第一次单击按钮时,计时器开始计时

问题是,计时器每下降一秒,按钮就会返回其原始位置。如何使计时器不影响按钮移动

以下是我的ViewController.m文件中的代码:

注意:我完全搞不懂这一点。我可能需要有人给我解释清楚,告诉我该怎么做。谢谢

注意:我的UIButton是“黑点”

-(iAction)主单击按钮{
intxmin=([blackDot frame].size.width)/2;
int ymin=([blackDot frame].size.height)/2;
int x=xmin+arc4random_uniform(self.view.frame.size.width-blackDot.frame.size.width);
int y=ymin+arc4random_uniform(self.view.frame.size.height-blackDot.frame.size.height);
[黑点设置中心:CGPointMake(x,y)];
如果(时间开始<1){
[timerLabel setText:@“时间:0:10”];
[self.view addSubview:timerLabel];
currMinute=0;
秒=10;
[自启动];
}
timerBeginInt=timerBeginInt+1;
}
-(无效)开始
{
计时器=[NSTimer scheduledTimerWithTimeInterval:1目标:自选择器:@selector(timerFired)用户信息:无重复:是];
}
-(无效)时间已满
{
如果((当前分钟>0 | |当前秒>=0)和当前分钟>=0)
{
如果(currSeconds==0)
{
currMinute-=1;
秒=59;
}
否则如果(当前秒数>0)
{
秒-=1;
}
如果(当前分钟>-1)
[timerLabel setText:[NSString stringWithFormat:@“%@%d%@%02d”,“时间:”,currMinute,@:”,currSeconds];
}
其他的
{
[计时器失效];
timerbeginin=0;
}
}

感谢您的帮助!谢谢

替换此
[黑点设置中心:CGPointMake(x,y)]
用这个

[blackDot setFrame:CGRectMake(x,y,blackDot.frame.size.width,blackDot.frame.size.height)];
同时放置断点并记录
x,y,xmin,ymin的值,以确认新位置与旧位置不同。
我希望这能帮到你。

洛吉亚普斯

我复制你的代码,用我自己的Xcode运行,我发现你的问题让你困惑

简短的解决方案如下:

打开故事板或xib文件,将其关闭。

如果要继续启用自动布局

[self.view removeConstraints:blackDot.constraints];

NSLayoutConstraint* leftConstraint = [NSLayoutConstraint constraintWithItem:blackDot attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeLeft multiplier:1.0f constant:x];

NSLayoutConstraint* topConstraint = [NSLayoutConstraint constraintWithItem:blackDot attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeTop multiplier:1.0f constant:y];

leftConstraint.active = YES;
topConstraint.active = YES;
更换
setCenter

出于更深层次的原因:

启用autolayout属性后,您无法更改IBOutlet的框架,每次尝试修改框架或中心都是非法的。您只能更改约束以移动IBOutlet

让我困惑的是:

根据代码,单击按钮,按钮将立即移动。但不会移动。因为像
setCenter
setFrame
这样的方法在自动布局中不起作用。
Autolayout需要约束才能将UI(iBouts)放在正确的位置。如果您一直打开Autolayout,然后不对iBouts进行约束,那么可能会发生任何我无法解释的事情。

您没有设置,而是尝试设置框架吗?@Mr.t我没有,我应该如何做?如果您想移动按钮,只需更改其框架即可。[按钮设置框:CGRectMake(x、y、宽度、高度)];您可以简单地更改其中的x和y值。如果您在故事板中使用autolayout,您还可以直接修改约束的常量(如果您在类中对约束进行了修改),并更改这些约束的值
[self.view removeConstraints:blackDot.constraints];

NSLayoutConstraint* leftConstraint = [NSLayoutConstraint constraintWithItem:blackDot attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeLeft multiplier:1.0f constant:x];

NSLayoutConstraint* topConstraint = [NSLayoutConstraint constraintWithItem:blackDot attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeTop multiplier:1.0f constant:y];

leftConstraint.active = YES;
topConstraint.active = YES;