1


我正在制作一些CGRect Utils类和函数来帮助我们操作 CGRect 和 View 的框架。

我面临一个非常奇怪的问题。我有一个图像,我可以通过按一些按钮来移动它。

- (IBAction)heightPlusTen:(id)sender {
    CGRectAddHeightToView(myView, 10);
}

CGRectAddHeightToView 只是一个#define,它可以被替换为:

- (IBAction)heightPlusTen:(id)sender {
    myView.frame = CGRectMake( myView.frame.origin.x,
             myView.frame.origin.y,
             myView.frame.size.width,
             myView.frame.size.height+10 );
}

到目前为止,图像正在移动。一切看起来都很好......
直到我运行这段代码:

- (IBAction)updatePosition:(id)sender {
    xLabel.text = [NSString stringWithFormat:@"%.0f", duck.frame.origin.x];
    yLabel.text = [NSString stringWithFormat:@"%.0f", duck.frame.origin.y];
    wLabel.text = [NSString stringWithFormat:@"%.0f", duck.frame.size.width];
    hLabel.text = [NSString stringWithFormat:@"%.0f", duck.frame.size.height];
}

假设在屏幕上显示 x、y、宽度和高度。但相反,它将图像移回几乎初始位置。

我知道很多代码都丢失了,所以在 github 上查看 CGRect Utils

4

2 回答 2

2

这是导致问题的自动布局..现在您可以一起删除自动布局,或者您可以保留它(以及它的许多好处),但也可以在 xib 加载后立即实例化标签.. 像这样:

// ViewController.m 
-(void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    xLabel.text = [NSString stringWithFormat:@"%.0f", duck.frame.origin.x];
    yLabel.text = [NSString stringWithFormat:@"%.0f", duck.frame.origin.y];
    wLabel.text = [NSString stringWithFormat:@"%.0f", duck.frame.size.width];
    hLabel.text = [NSString stringWithFormat:@"%.0f", duck.frame.size.height];        
}

这样,当您将来更新标签时,自动布局就不必重新调整任何内容。

于 2013-07-28T07:59:57.760 回答
1

你真的应该考虑在这个时代使用 ARC。

至于您的问题:autolayout更新标签时是否会导致此帧重置。

如果您禁用它,ViewController.xib那么您的代码将“按预期”工作。

一个非常好的关于自动布局以及如何使用它的教程可以在这里找到:Beginning Auto Layout in iOS 6

Autolayout是一个很好的工具,但有时会引起严重的头痛。

于 2013-07-28T07:52:30.983 回答