各位开发者,我在Interface Builder(Xcode 5/iOS 7)中遇到AutoLayout问题.这是非常基本和重要的,所以我想每个人都应该知道这是如何正常运作的.如果这是Xcode中的一个错误,那就是一个关键错误!
所以,每当我有一个像这样的视图层次结构时,我遇到了麻烦:
>UIViewController
>> UIView
>>>UIScrollView
>>>>UILabel (or any other comparable UIKit Element)
Run Code Online (Sandbox Code Playgroud)
UIScrollView具有可靠的约束,例如,每侧50 px(没问题).然后我向UILabel添加一个Top Space约束(没问题)(我甚至可以固定标签的高度/宽度,不做任何改变,但由于Label的内在大小,应该是不必要的)
当我向UILabel添加尾随约束时,麻烦就开始了:
例如,尾随空间:Superview等于:25
现在出现了两个警告 - 我不明白为什么:
A)可滚动内容大小歧义(滚动视图具有不明确的可滚动内容高度/宽度)
B)错位视图(预期标签:x = -67实际值:x = 207
我在一个新的项目中做了这个最小的例子,你可以下载并附上截图.如您所见,Interface Builder期望Label位于UIScrollView边界之外(橙色虚线矩形).使用Resolve Issues Tool更新Label的框架会将其移动到那里.
请注意:如果用UIView替换UIScrollView,行为就像预期的那样(Label的框架是正确的,并且根据约束条件).所以似乎UIScrollView存在问题,或者我错过了重要的事情.
当我按照IB的建议运行应用程序而不更新Label的框架时,它定位得很好,正好在它应该是的位置,并且UIScrollView是可滚动的.如果我更新框架,标签不在视线范围内,UIScrollView不会滚动.
帮助我Obi-Wan Kenobi!为什么模棱两可的布局?为什么错位的观点?
你可以在这里下载示例项目,如果你能弄清楚发生了什么就试试:https: //github.com/Wirsing84/AutoLayoutProblem

自上周以来我一直试图解决这个问题,而没有更进一步.好的,所以我需要在Swift中以编程方式应用一些约束 来使用这段代码:UIView
var new_view:UIView! = UIView(frame: CGRectMake(0, 0, 100, 100));
new_view.backgroundColor = UIColor.redColor();
view.addSubview(new_view);
var constX:NSLayoutConstraint = NSLayoutConstraint(item: new_view, attribute: NSLayoutAttribute.CenterX, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.CenterX, multiplier: 1, constant: 0);
self.view.addConstraint(constX);
var constY:NSLayoutConstraint = NSLayoutConstraint(item: new_view, attribute: NSLayoutAttribute.CenterY, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.CenterY, multiplier: 1, constant: 0);
self.view.addConstraint(constY);
var constW:NSLayoutConstraint = NSLayoutConstraint(item: new_view, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.Equal, toItem: new_view, attribute: NSLayoutAttribute.Width, multiplier: 1, constant: 0);
self.view.addConstraint(constW);
var constH:NSLayoutConstraint = NSLayoutConstraint(item: new_view, attribute: …Run Code Online (Sandbox Code Playgroud) 我花了两天时间尝试混合和纯Autolayout方法的各种解决方案,以实现自动布局之前的简单滚动视图设置,现在它已经正式 - 我必须太愚蠢.我主要是在Storyboard中设置它(好吧,它就是这样).
所以这是我的求助.
Viewtree:
UIView
-UIView
-UIView
..-UIScrollview
...-UIButton
...-UIButton
...-UIButton
Run Code Online (Sandbox Code Playgroud)
按钮应该水平滚动(从左到右,反之亦然).有人可以请让我知道如何设置的约束来实现这个使用纯自动布局???
-
我尝试过混合方法,如下所示:
UIView
- UIView
- UIView
..-UIScrollview
...-UIView (contentview)
....-UIButton
....-UIButton
....-UIButton
Run Code Online (Sandbox Code Playgroud)
...并根据Apple的TechNote contentview为translatesAutoresizingMaskIntoConstraints设置和设置设置固定的宽度和高度限制.使用约束设置按钮和滚动视图.这让滚动视图滚动(yay)但是唉,它滚动得太远了!据我所知,滚动宽度在某种程度上比我设置的内容视图加倍了??? !!! ???
我尝试了纯自动布局方法,包括contentview有无.所有观点都是translatesAutoresizingMaskIntoConstraints=NO,除了self.view.按钮具有固定的宽度/高度约束,并固定到滚动视图的所有四个边缘.什么都不滚动.
所以我完全不知道为什么我不能让它正常工作.非常感谢任何帮助,如果您需要任何其他信息,请询问!
更新截图与解决方案 - buttonZ约束:

编辑@ Jamie Forrest 所以解决方案结果是最后一个按钮的错误尾随约束.而不是6441,我设置的值是负数,-6441.棘手的是,在storyboard中设置值时,Pin工具栏中有两个选项:

当前画布值为负(导致无滚动),下面的选项为正(激活滚动).这意味着我不是傻瓜,但我猜至少半盲.虽然,为了我的辩护,XCode没有为"错误"设置显示错误,这有点令人不安吗?
再次编辑 现在这很有趣......将尾随值从-6441(无滚动)更改为6441启用滚动.但我的老朋友"太多内容化"又回来了,导致内容大小是应有的两倍!获取正确内容滚动的解决方案是将尾随约束设置为ZERO!当在Storyboard中工作但是查看@Infinity James的代码时,这并不明显,它应该是什么.
是否可以自动调整UILabel框/边界的大小以适应包含的文本?(我不在乎它是否比显示器大)
因此,如果用户输入"你好"或"我的名字真的很长,我希望它适合这个盒子",它永远不会被截断,标签会相应地"加宽"吗?
我在使用Autolayout和约束来调整UIView的大小时遇到了问题.我想改变原点(小于或等于原始)和宽度(大于或等于原始)但我得到了这个:不等式约束歧义
你有解决这个问题的想法吗?
谢谢


我有一个label和button在superView这样的.
|--------------[Label]-----[button]-|
Run Code Online (Sandbox Code Playgroud)
我想的label是centred如果可能的话,那么有差距最小的button,并向左移动.
所以,如果按钮很大,它看起来像......
|-[ LABEL! ]-[button]-|
Run Code Online (Sandbox Code Playgroud)
因此,按钮保持原样并且尺寸相同.并且元素之间存在最小间隙.
我可以添加centerX约束,但我似乎无法给它一个优先级,所以它仍然存在Required.
我该如何创造这种情况?我在代码中进行所有自动布局.
我目前的限制是......
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|-[_label]-(>=8@1000)-[_button(==45)]-|"
options:NSLayoutFormatAlignAllCenterY
metrics:nil
views:views]];
[self addConstraint:[NSLayoutConstraint constraintWithItem:_label
attribute:NSLayoutAttributeCenterX
relatedBy:NSLayoutRelationEqual
toItem:self.contentView
attribute:NSLayoutAttributeCenterX
multiplier:1.0
constant:0.0]];
Run Code Online (Sandbox Code Playgroud)
但我不确定如何降低第二个约束的优先级.

我希望底部视图距离图像和其上方的标签至少20个.标签是多行的,因此它可以比图像视图更高或更短,具体取决于文本的数量.当我添加两个"距离最近邻居> = 20"的约束时,如屏幕截图所示,Xcode告诉我约束是模棱两可的.
我如何解决它?
我正在使用故事板和自动布局创建iOS应用程序,以便在iPhone4和iPhone5上都能正常运行.下面是我使用故事板创建的视图的屏幕截图.

在上图中,我想将滚动视图保持在superview的前沿和右表视图的中间.我不希望滚动视图在iPhone5中增加其宽度.我尝试了不同的约束组合,但我无法实现它.
有些人可能会建议我为滚动视图设置的所有约束是什么,以便它位于中心.
嗨,我正在开发小型IOS应用程序,其中我使用scrollview与自动布局.内部滚动我添加了两个以上的视图.我正在使用IB和自动布局约束.我以纵向方式一个接一个地添加两个视图.我添加了外部约束,如尾随,前导,顶部,底部空间.我还为两个视图添加了高度限制.直到这一切都运转良好.
但我的view1有一些动态内容.出于这个原因,我想使高度约束大于等于而不是等于.

那么如何解决这个问题呢.需要一些帮助.谢谢.
ios ×9
autolayout ×8
objective-c ×4
uiscrollview ×4
iphone ×2
storyboard ×2
swift ×2
constraints ×1
ios7 ×1
uilabel ×1
uiview ×1