iOS:带有子视图控制器的Autolayout

时间:2013-07-10 22:43:05

标签: ios autolayout viewcontroller childviewcontroller flkautolayout

我现在已经使用autolayout几周了。 目前,我正在使用名为FLKAutoLayout的第三方库,这使得该过程更容易。 我可以按照自己想要的方式构建视图,通常没有问题。 然而,在过去4天的工作中,一旦参与了控制器,我就一直在努力进行自动布局。 我对各种各样的UIViews很好......但由于某种原因,每个viewcontroller.view都是一个完全的恶魔。 除了让viewcontroller.view按照我想要的方式调整大小的问题之外我什么都没有,而且更深层次的问题是,当使用autolayout时,子视图控制器的UIViews没有正确接收事件。 子视图控制器在手动指定帧时工作得很好,但是所有内容都会因autolayout而崩溃。

我不明白一个视图控制器的UIView有什么不同之处让它与其他所有人不同......我的思绪正在沮丧地融化。 ios在幕后或其他什么地方搞乱了我的viewcontroller视图吗?

sample image http://i39.tinypic.com/6qeh3r.png

在图像中,红色区域属于子视图控制器。这个区域不应该超过最底部的子视图(表示三个的卡)。这应该很简单,我可以通过一堆普通的UIViews使它工作得很好但是因为这是一个viewcontroller,一切都会破坏......

任何人都可以了解我不知道的是什么。任何潜在问题的线索都非常感谢。

感谢阅读。

更新:问题可能与模棱两可的约束有关

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];

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

2 个答案:

答案 0 :(得分:5)

这应该是一个评论,但评论很糟糕。 ; - )


您是否检查过模棱两可的限制?对我来说,这种观点看起来可能是由于模棱两可的约束造成的。

将此代码添加到您的app delegate:

// 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");
    }
}

现在摇动你的模拟器。您将在硬件菜单中找到摇动手势。

如果未显示“No Ambiguous autolayout found”,则检查打印的跟踪中的不明确的ui元素。它们标有“AMBIGUOUS”。

然后开始添加约束,以便不再有歧义。

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


并确保删除运送产品中的调试代码。您可以将这两部分放在#if DEBUG#endif

之内

答案 1 :(得分:1)

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

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

至于你的自动布局问题:Erica Sadun写了一些very useful autolayout debugging tools。我主要使用它来查看她在UIView上的类别中编写的viewLayoutDescription,它打印出一个非常易读的约束列表,告诉你模糊性等等。试一试,这真的帮助我弄清楚了我的约束如何搞砸了。

第二:始终确保您的所有观看次数都设置为translateAutoresizingMasksIntoConstraints {/ 1}}。