【问题标题】:Preserve Variable in a method在方法中保留变量
【发布时间】:2011-10-07 07:22:54
【问题描述】:

这应该很容易。

我有一种上下移动视图的方法,在此过程中,我上下移动了一个 UIButton……然后当该方法再次运行时,将按钮移回其原始位置。

我想我可以使用 float originalCenterX = topSubmitButton.center.x 和 float originalCenterY = topSubmitButton.center.y 获得按钮的原始位置,但是当方法被点击时,这些按钮的中心当然会被覆盖第二次。

如何在方法的多次迭代中保留变量?

-(IBAction)scrollForComment { 

[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.5]; 

CGRect rect = self.view.frame;

NSLog(@"button center x = %f y = %f",topSubmitButton.center.x,topSubmitButton.center.y);
float originalCenterX = topSubmitButton.center.x;
float originalCenterY = topSubmitButton.center.y;

if (commentViewUp) {
    rect.origin.y = self.view.frame.origin.y + 80;// move down view by 80 pixels
    commentViewUp = NO;

    CGPoint newCenter = CGPointMake( 57.0f , 73.0f); // better to calculate this if you are going to rotate to landscape

    [UIView beginAnimations:nil context:nil]; 
    [UIView setAnimationDuration:0.5f];
    topSubmitButton.center = newCenter;
    [UIView commitAnimations];

} else { // toggling the view's location
    rect.origin.y = self.view.frame.origin.y - 80;// move view back up 80 pixels
    commentViewUp = YES;


    CGPoint newCenter = CGPointMake(160 , 74.0f + topSubmitButton.center.y);// would like to calculate center
    [UIView beginAnimations:nil context:nil]; 
    [UIView setAnimationDuration:0.5f];
    topSubmitButton.center = newCenter;
    [UIView commitAnimations];
  }

self.view.frame = rect;

[UIView commitAnimations];

}

如果您能告诉我如何将视图的中心放置在 CGPoint 的 x 值中,那就太好了。

【问题讨论】:

  • 我猜你会想要将值存储在成员变量或全局变量中(取决于你是否有成员函数或全局函数)。我真的不了解 Objective-C,所以我不会将其作为答案发布。
  • 此外,您可以通过取宽度、除以二并添加到矩形左侧的 x 偏移量来获得任何类型矩形的“中心”(例如,如果它向右移动了一些单位)。

标签: objective-c ios animation uibutton cgpoint


【解决方案1】:

您可以使用静态变量在方法调用之间保留其内容。但是,初始化程序必须是常量,因此您不能调用方法来初始化它。您可以做的是使初始值无效,并在设置变量之前对此进行测试。

-(IBAction)scrollForComment {
    static float originalCenterX = −1, originalCenterY = −1; // Assuming −1 would be an invalid value
    if(originalCenterX == −1 && originalCenterY == −1) {
        CGPoint temp = topSubmitButton.center;
        originalCenterX = temp.x;
        originalCenterY = temp.y;
    }
    ...

如果您能告诉我如何将视图的中心放置在 CGPoint 的 x 值中,那就太好了。

我不确定你的意思。如果希望只能设置中心的x坐标,则需要获取当前中心,更改x坐标,保存新点。

CGPoint temp = topSubmitButton.center;
temp.x = newXValue;
topSubmitButton.center = temp;

【讨论】:

  • 谢谢。通过“将视图的中心放在 CGPoint 的 x 值中”,我的意思是这是无效的 CGPoint newCenter = CGPointMake(self.view.frame center , 73.0f); “错误的接收器类型 'CGRect'。我正在将 UIButton 移动到屏幕的中心,我现在使用的是 160,它可以工作,但如果我启用旋转到横向将无法工作。
  • @Michael 您只需要使用 center 属性并获取结果的 x 坐标。 CGPoint newCenter = CGPointMake(self.view.center.x, 73.0f)。或者,您可以将框架宽度的一半添加到其 x 坐标。 CGPoint newCenter = CGPointMake(self.view.frame.origin.x + self.view.frame.size.width / 2, 73.0f).
  • 静态方法不起作用,但我接受了答案,因为我认为这是正确的方法,我必须做错别的事情。
  • static 将保留方法调用之间的值,但不会阻止您在以后的调用中对其进行修改。确保在不检查变量是否已经设置的情况下永远不要更改变量。