我现在已经使用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];
上面的示例是一个模棱两可的布局,但我无法弄清楚它有什么问题...
答案 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}}。