1

我已经使用自动布局几个星期了。目前,我正在使用一个名为 FLKAutoLayout 的第 3 方库,它使该过程更容易。我现在可以按照我想要的方式构建视图,通常没有问题。然而,在过去 4 天的工作中,一旦涉及到视图控制器,我一直在努力解决自动布局问题。我对各种 UIViews 都很好......但由于某种原因,每个 viewcontroller.view 都是一个恶魔。除了让 viewcontroller.view 按照我想要的方式调整大小之外,我什么都没有,更深层次的问题是子 viewcontroller 的 UIView 在使用自动布局时无法正确接收事件。手动指定框架时,​​子视图控制器工作得很好,但是自动布局会破坏一切。

我不明白 viewcontroller 的 UIView 有什么不同,使它与其他所有不同......我的思绪在沮丧中融化。ios 是否在幕后弄乱了我的视图控制器视图或其他什么?

示例图像

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

任何人都可以阐明它是什么我不知道。非常感谢有关潜在问题的任何线索。

谢谢阅读。

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

UIView *box = [[UIView alloc]init];
[box addSubview:imageView];
[box addSubview:nameLabel];

imageView constrainWidth:@"32" height:@"32"];
[imageView alignTop:@">=0" leading:@"0" bottom:@"<=0" trailing:@"<=0" toView:box];
[imageView alignCenterYWithView:box predicate:@"0"];

[nameLabel constrainLeadingSpaceToView:imageView predicate:@"5"];
[nameLabel alignTop:@">=0" leading:@">=0" bottom:@"<=0" trailing:@"<=0" toView:box];
[nameLabel alignCenterYWithView:box predicate:@"0"];

[self addSubview:box];
[box alignTop:@"5" leading:@"5" bottom:@"-5" trailing:@"-5" toView:self];

上面的示例是一个模棱两可的布局,但我无法弄清楚它有什么问题......

4

2 回答 2

5

这可能应该是一条评论,但评论对于代码来说很糟糕。;-)


您是否检查了模棱两可的约束?对我来说,这种观点看起来可能是由模棱两可的约束引起的。

将此代码添加到您的应用委托中:

// 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 元素。它们标有“模棱两可”。

然后开始添加约束,这样就不会再有歧义了。

您可以调用exerciseAmbiguityInLayout具有不明确布局的 UI 元素来提示缺少哪些约束。


并确保删除您发货产品中的调试代码。你可以把这两个部分放在#if DEBUG里面#endif

于 2013-07-10T22:52:26.997 回答
1

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

这将确保您的旋转和触摸事件以您期望的方式转发。

至于您的自动布局问题:Erica Sadun 编写了一些非常有用的自动布局调试工具。我主要用它来查看viewLayoutDescription她在 UIView 上的一个类别中编写的内容,它打印了一个非常易读的约束列表,告诉你歧义等。试一试,它真的帮助我弄清楚我的约束是如何被弄乱的向上。

第二:始终确保您的所有视图都translateAutoresizingMasksIntoConstraints设置为NO.

于 2013-07-11T07:05:15.153 回答