我正在制作一些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,宽度和高度。但相反,它会将图像移回几乎的初始位置。
我知道很多代码都丢失了所以checkout CGRect Utils on github。
答案 0 :(得分: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];
}
这样,在将来更新标签时,autolayout将不必重新调整任何内容。
答案 1 :(得分:1)
你真的应该考虑在这个时代使用ARC。
至于你的问题:autolayout
在更新标签时导致此帧重置。
如果您在ViewController.xib
上停用它,那么您的代码将“按预期”运行。
有关autolayout以及如何使用它的非常好的教程可以在这里找到:Beginning Auto Layout in iOS 6
Autolayout
是一个很好的工具,但有时会引起严重的麻烦。