Ios UILabel和UITableView CGrectMake重新格式化-iPhone

Ios UILabel和UITableView CGrectMake重新格式化-iPhone,ios,iphone,uitableview,uilabel,cgrectmake,Ios,Iphone,Uitableview,Uilabel,Cgrectmake,我有一个导航控制器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

我有一个导航控制器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)];
正在使用自动布局。。但我还是无法解决这个问题。我已经附上了同样的图片

!![在此处输入图像描述][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方法。。但是没有运气。。。有什么建议吗

故事板图像


假设您使用的是iOS 7,这是因为默认情况下已将来自XCode 5及以上版本的自动布局添加到项目中。因此,故事板中的帧最终会转换为恒定的帧。因此,如果您更改帧,它可能会在那一刻生效,但当视图再次加载时,它将从情节提要中取回帧,而不是您更改的帧

所以你的问题的解决方案是你必须手动添加约束,只改变约束常数,而不是框架。苹果很快就会放弃框架,所以开始学习自动布局


PS:如果您在故事板的检查器中取消选中“使用自动布局”选项,您的代码将按预期工作

你使用xib还是故事板?如果我是你,我会使用键值观察来观察标签的框架。嗨,我试过了,发现在导航过程中高度发生了变化。不知道为什么,但我再次尝试重新构造它,但不起作用。设置一个断点,您将看到调用堆栈。上面说什么?你也可以打印旧值和新值。我已经打印了旧值和新值。。。旧值{{71,73},{179,20}更改后的新值为{{71,73},{179,0}。。。我将把我所做的代码添加到问题中。。请检查编辑。。。iOS 6及以下版本不提供自动布局,因此不使用它。。。还有一件事是,除了故事板,我不会在任何地方更改或设置框架。我添加的代码只是为了确保标签保留其框架。我想您可能没有注意到iOS 6中引入了Autolayout。请检查您的故事板设置,并指定您正在使用的XCode版本。确定。。。如果您的部署目标是iOS 5及以上版本,那么您就不能使用AutoLayout,因为它是从iOS 6开始引入的。我使用的是Xcode 5。。因此,我的部署目标是iOS 5,因此我不能使用自动布局。我已经检查了您所说的XCode 5和部署到iOS 5的方式,正如我所回答的,默认情况下它采用自动布局。打开故事板->并检查Inspector中的第一个选项卡是否已启用自动布局。我非常确定它已启用。首先请检查它,然后回复。好的。。。请转到生成设置。。。将您的部署目标更改为iOS5。。然后尝试启用自动布局,看看是否可以启用。。它会给你一个错误。。。