iOS:具有子视图控制器的自动布局

iOS:具有子视图控制器的自动布局,ios,autolayout,viewcontroller,childviewcontroller,flkautolayout,Ios,Autolayout,Viewcontroller,Childviewcontroller,Flkautolayout,我已经使用autolayout几个星期了。 目前,我正在使用一个名为FLKAutoLayout的第三方库,这使得这个过程更加容易。 我现在可以按照我想要的方式构造视图,通常没有问题。 然而,在过去4天的工作中,一旦涉及到viewcontrollers,我就一直在努力解决autolayout问题。 我对各种各样的观点都很满意。。。但由于某些原因,每个viewcontroller.view都是一个恶魔。 我在获取viewcontroller.view以我想要的方式调整大小时遇到了问题,而更深层的问题

我已经使用autolayout几个星期了。 目前,我正在使用一个名为FLKAutoLayout的第三方库,这使得这个过程更加容易。 我现在可以按照我想要的方式构造视图,通常没有问题。 然而,在过去4天的工作中,一旦涉及到viewcontrollers,我就一直在努力解决autolayout问题。 我对各种各样的观点都很满意。。。但由于某些原因,每个viewcontroller.view都是一个恶魔。 我在获取viewcontroller.view以我想要的方式调整大小时遇到了问题,而更深层的问题是,子viewcontroller的UIView在使用autolayout时无法正确接收事件。 当手动指定帧时,子视图控制器工作正常,但使用autolayout时,一切都会发生故障

我不明白viewcontroller的UIView有什么不同,它与其他所有视图都不一样。。。我的心在沮丧中融化。ios是否在幕后干扰了我的viewcontroller视图

在图像中,红色区域属于子视图控制器。该区域不应超过最底部的子视图(显示三的卡片)。这应该很容易,我可以让它与一堆正常的UIView一起正常工作,但因为这是一个viewcontroller,一切都会中断

有人能解释一下是什么吗?我不知道。任何关于潜在问题的线索都非常感谢

谢谢你的阅读

更新:问题可能与不明确的约束有关

UIView*box=[[UIView alloc]init];
[框添加子视图:图像视图];
[框添加子视图:名称标签];
图像视图宽度:@“32”高度:@“32”];

[imageView alignTop:@“>=0”前导:@“0”底部:@“=0”底部:@”这可能是一条注释,但注释对于代码来说很糟糕;-)


你检查过不明确的约束吗?在我看来,这个视图可能是由不明确的约束引起的

将此代码添加到您的应用程序代理:

// before @implementation AppDelegate
@interface UIWindow (AutoLayoutDebug)
+ (UIWindow *)keyWindow;
- (NSString *)_autolayoutTrace;
@end

// inside of @implementation

- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event {
    NSString *autolayoutTrace = [[UIWindow keyWindow] _autolayoutTrace];
    if ([autolayoutTrace rangeOfString:@"AMBIGUOUS"].location != NSNotFound) {
        NSLog(@"%@", autolayoutTrace);
    }
    else {
        NSLog(@"No Ambiguous autolayout found");
    }
}
现在摇动你的模拟器。你会在硬件菜单中找到摇动手势

如果未显示“未找到不明确的自动布局”,请检查打印的跟踪中是否存在不明确的ui元素。它们被标记为“不明确”

然后开始添加约束,这样就没有更多的歧义了

您可以在布局不明确的UI元素上调用
exerciseDumbuityInLayout
,以获得缺少哪些约束的提示



并确保删除装运产品中的调试代码。您可以将这两部分放在
#if DEBUG
#endif
中。这可能是一条注释,但注释对于代码来说很糟糕。;-)


你检查过不明确的约束吗?在我看来,这个视图可能是由不明确的约束引起的

将此代码添加到您的应用程序代理:

// before @implementation AppDelegate
@interface UIWindow (AutoLayoutDebug)
+ (UIWindow *)keyWindow;
- (NSString *)_autolayoutTrace;
@end

// inside of @implementation

- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event {
    NSString *autolayoutTrace = [[UIWindow keyWindow] _autolayoutTrace];
    if ([autolayoutTrace rangeOfString:@"AMBIGUOUS"].location != NSNotFound) {
        NSLog(@"%@", autolayoutTrace);
    }
    else {
        NSLog(@"No Ambiguous autolayout found");
    }
}
现在摇动你的模拟器。你会在硬件菜单中找到摇动手势

如果未显示“未找到不明确的自动布局”,请检查打印的跟踪中是否存在不明确的ui元素。它们被标记为“不明确”

然后开始添加约束,这样就没有更多的歧义了

您可以在布局不明确的UI元素上调用
exerciseDumbuityInLayout
,以获得缺少哪些约束的提示



并确保删除装运产品中的调试代码。您可以将这两部分放入
#if DEBUG
#endif
中。在代码中的某个特定点,您需要将子视图控制器添加到视图控制器层次结构中:
[topViewController addChildViewController:childViewController]
。不要忘记添加
-didMoveToParentViewController:

这将确保您的旋转和触摸事件按预期方式转发

至于你的自动布局问题:Erica Sadun写了一些。我主要使用它来查看她在UIView上的一个类别中编写的
viewLayoutDescription
,它打印了一个非常可读的约束列表,告诉你一些模糊性等。试试看,它确实帮助我弄清楚我的约束是怎么搞砸的


第二:始终确保所有视图的
translateAuthorizingMasksintoConstraints
设置为
NO

在代码中的某个点,您需要将子视图控制器添加到视图控制器层次结构中:
[topViewController addChildViewController:childViewController]
。不要忘记添加
-didMoveToParentViewController:

这将确保您的旋转和触摸事件按预期方式转发

至于你的自动布局问题:Erica Sadun写了一些。我主要使用它来查看她在UIView上的一个类别中编写的
viewLayoutDescription
,它打印了一个非常可读的约束列表,告诉你一些模糊性等。试试看,它确实帮助我弄清楚我的约束是怎么搞砸的


第二:始终确保所有视图的
translateAutoResizengMasksIntoConstraints
设置为
NO

您应该显示添加子视图控制器的代码,以及您尝试添加的约束。这些都在滚动视图中吗?此时滚动视图中没有任何内容。然而,在过去,当我尝试在autolayout中使用滚动视图时,所有视图都被压缩为超级紧凑。但是,这是未来的另一个问题。您应该显示添加子视图控制器的代码,以及您尝试添加的约束条件。这些都在滚动视图中吗?目前滚动视图中没有任何内容。但是,在过去,当我尝试时在autolayout中使用滚动视图,所有视图都被压缩为超级紧凑。但是,这是未来的另一个问题。谢谢Matthias!我发现了大量的ambi