0

我的目标是创建一个按钮,只要你按下它,它就会自动移动到一个随机位置。我得到这个来处理这个动作:

- (IBAction)move:(id)sender 
{
   int x = 0 + arc4random() % (260 - 0);
   int y = 0 + arc4random() % (400 - 0);

   frame = self.button.frame;
   frame.origin.x = x; // new x coordinate
   frame.origin.y = y; // new y coordinate
   self.button.frame = frame;
}

但是后来我尝试添加一个计时器,由一个按钮触发:

- (IBAction)start:(id)sender 
{
   timer =[NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(showActivity) userInfo:nil repeats:YES];
   self.startButton.Hidden = YES;
   self.label.hidden = NO; 
}

- (void)showActivity
{

   int currentTime = [self.label.text intValue];
   int newTime = currentTime - 1;
   self.label.text = [NSString stringWithFormat:@"%d", newTime];

   if (newTime == 0)
   {
       [timer invalidate];
   }
}

每次计时器滴答作响,似乎都会重新绘制视图。在我启动计时器之前,可以很好地移动按钮。然后,一旦我按下启动计时器的第二个按钮,第一个按钮就植根于我最初将它放在我的 xib 文件中的位置。有什么办法可以解决这个问题吗?

4

2 回答 2

0

这个怎么样...

- (void)repositionViewRandomly:(UIView *)view {

    CGFloat width = view.bounds.size.width;
    CGFloat height = view.bounds.size.height;

    int x = arc4random() % (int)(view.superview.bounds.size.width - width);
    int y = arc4random() % (int)(view.superview.bounds.size.height - height);

    [UIView animateWithDuration:0.5 animations:^{
        view.frame = CGRectMake(x, y, width, height);
    }];
}

- (IBAction)buttonPressed:(id)sender {

    [self performSelector:@selector(repositionViewRandomly:) withObject:sender afterDelay:1.0];
}
于 2013-01-27T02:04:17.030 回答
0

这个问题很可能是自动布局的结果(iOS 6 的一项功能,它根据称为约束的算术规则控制控件的放置)。要查看是否启用了自动布局,请打开情节提要/NIB,按option+ command-1转到“文件检查器”(或只需单击最右侧面板上的第一个“文件检查器”选项卡)并查看“自动布局”是否选中。

如果启用自动布局,即使在更改帧之后,也会重新应用约束,并且控件将移回约束指定的位置。您可以关闭自动布局,或者保持自动布局打开,然后以编程方式删除约束或以编程方式更改约束而不是更改框架。

有关如何通过更改约束来制作动画的示例,请参见此答案。但最简单的方法是关闭自动布局:

自动布局设置

有关 autolaout 上各种资源的背景信息和链接,请参阅Cocoa Auto Layout Guide

于 2013-01-27T02:29:00.500 回答