我有一个NavigationControllers A和一个UIViewController B. A有一个标签,下面是UITableView。当从A导航到B并从B导航回A时,我重新标记了我的标签和表格视图。我已经尝试通过ViewWillAppear方法中的代码设置框架。然而,我没有它的确切框架。我在这里缺少什么基本的东西?
[self.labelUser setFrame:CGRectMake(71, 73, 179, 20)];
[self.customersTable setFrame:CGRectMake(0, 102, 320, 421)];
Autolayout正在使用..但是我无法解决这个问题。我附上了相同的图像
![在此处输入图像说明] [2]![在此输入图像说明] [3]
编辑:KVO的代码,用于检查帧值并将帧更改回原始
ViewDidLoad中的
[labelUser addObserver:self forKeyPath:@"frame" options:(NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld) context:NULL];
然后
- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context {
if ([keyPath isEqual:@"frame"]) {
NSLog(@"changed %@ %@", NSStringFromCGRect(labelUser.frame), NSStringFromCGRect(customersTable.frame));
if (![NSStringFromCGRect(labelUser.frame) isEqual:NSStringFromCGRect(CGRectMake(71, 73, 179, 20))]) {
[labelUser removeObserver:self forKeyPath:@"frame"];
[self.labelUser setFrame:CGRectMake(71, 73, 179, 20)];
[self.customersTable setFrame:CGRectMake(0, 102, 320, 421)];
}
}
}
像这样推动视图
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
[self performSegueWithIdentifier:@"segueToOrd" sender:self];
}
还尝试了KVO方法..但没有运气......有什么建议吗?
故事板图片
答案 0 :(得分:0)
假设您使用的是iOS 7,这是因为默认情况下已将XCode 5及以上版本的AUTOLAYOUT添加到项目中。因此,Storyboard中的帧最终会转换为不变的帧。因此,如果您更改帧,它可能会在那一刻生效,但是当视图再次加载时,它将从故事板中取回帧而不是您已更改的帧。
因此,您的问题的解决方案是您必须手动添加约束并且只更改约束常量而不是帧.Apple将很快抛弃框架,因此开始学习Autolayout。
PS:如果您在故事板的检查器中取消选中“使用Autolayout”选项,您的代码将按预期工作。