0

我有一个 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)];

正在使用自动布局..但这我无法解决。我已经附上了相同的图像

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

故事板图像

在此处输入图像描述

4

1 回答 1

0

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

因此,您的问题的解决方案是您必须手动添加约束并且只更改约束常量而不是框架。Apple 很快就会放弃框架,所以开始学习 Autolayout。

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

于 2014-01-23T07:25:38.740 回答